OpenCV: 目的別機能
画像の入出力
画像がファイルとして存在する場合は Imgcodecs
クラスのメソッドを使用する。ファイルの入出力フォーマットは出力先のファイル名の拡張子で決定する。ファイルが存在しないなどの理由で読み込みに失敗した場合は空の画像 (行列) が返る。
import org.opencv.imgcodecs.Imgcodecs
def copy(src:String, dst:String):Unit = {
val image = Imgcodecs.imread(file)
if(! image.empty()){
Imgcodecs.imwrite(dst, image)
}
image.release()
}
ただし imread()
は Windows 環境で日本語 (非 US-ASCII 文字) を含むファイルやディレクトリ名を正しく認識できない。この場合、ファイル全体を言語標準の方法でバイナリデータとして読み込んで imdecode()
を使用することで回避することができる。
import org.opencv.imgcodecs.Imgcodecs
import java.io.File
import java.nio.Files
def readImage(file:File):Mat = {
val bin = new MatOfByte(Files.readAllBytes(file.toPath):_*)
Imgcodecs.imdecode(bin, Imgcodecs.CV_LOAD_IMAGE_UNCHANGED)
bin.release()
}
def writeImage(file:File, image:Mat):Unit = {
val ext = file.getName.split("\\.").drop(1).lastOption.map(e => s".$e").getOrElse("")
val bin = new MatOfByte()
Imgcodecs.imencode(ext, image, bin)
Files.write(file.toPath, bin.toArray)
bin.release()
}
ネットワークから読み込んだバイト配列から画像を作成するような場合も上記を少し修正して対処することができる。
色域を指定して塗りつぶす
目的: 主旨と異なる部分から特徴を検出しないように、対象物が持つことのない色からマスクを作成し塗りつぶす。例えば一般的なキノコは葉緑体を持たないため画像の中で緑の部分はキノコとは関係がないと考えられる。
手順: 塗りつぶしの対象となる色域の範囲を指定してマスクを作成し、画像に適用する。
def blottingOut(image:Mat, low:Scalar, high:Scalar):Mat = {
val hsv = new Mat()
Imgproc.cvtColor(image, hsv, Imgproc.COLOR_BGR2HSV, 3)
val mask = new Mat()
Core.inRange(hsv, low, high, mask) // 色域でマスク作成
Core.bitwise_not(mask, mask) // マスク反転
val dest = new Mat()
image.copyTo(dest, mask)
hsv.release()
mask.release()
dest
}
// 色相 (0,180)、彩度(0,255)、明度(0,255)の順
val low = new Scalar(30, 120, 100)
val high = new Scalar(90, 255, 255)
val dest = blottingOut(src, low, high)
色相 (H) は 180 度で示されていて 0 (=180) が赤、60 で緑、120 が青を表している点に注意。人の感覚ではなくカラーチャネルが重要であれば BGR での指定もほぼ同じ方法で可能。
bitwise_not()
を削除すれば指定した色域以外を塗りつぶす処理となる。
画像から物体を切り抜き
画像の中から対象物の写っている部分を検出してトリミングする。
- 二値化: しきい値を決めて明るさで 2 値化する。
- ラベリング:
- 特徴量マッチング:
手順: 以下のような画像セットからキノコに相当する部分を切り取る
参照
- Welcome to OpenCV Java Tutorials documentation!
- Gary Bradski, Adrian Kaehler (2018), 詳解 OpenCV 3 ― コンピュータビジョンライブラリを使った画像処理・認識, O'REILLY JAPAN
- Python版OpenCV入門サンプル集