はじめに
前回の記事では、画像処理における明るさとコントラストの変化について説明しましたが、今回は閾値関数を作成します。
最も単純な画像分割方法
しきい値処理は、最も単純な画像セグメンテーション方法です。
たとえば、下の写真からリンゴをセグメント化するには、前景と背景の間のグレースケールの差を使用してしきい値を設定します。ピクセルがこのしきい値より大きい場合、黒で表示されます。しきい値より小さい場合は、灰色で表示されます。
5つの閾値タイプ
OpenCV と同様に、使いやすいように 5 つのしきい値タイプを提供します。
以下は元の画像の波形表現です。縦軸はピクセルのグレー値を表し、青い線はしきい値のサイズを表します。
バイナリしきい値
式は次のとおりです:
画像表現は次のとおりです:
閾値を超えた場合は最大値(つまり255)となり、それ以外の場合は最小値(つまり0)となることがわかります。この関数を実装するには関数が必要です:
var CV_THRESH_BINARY = function(__value, __thresh, __maxVal){
return __value > __maxVal : 0;
逆バイナリしきい値
式は次のとおりです:
texttt{thresh}$}{texttt{maxVal}}{otherwise}" src="http://files.jb51.net/file_images/article/201301/2013010314344055.png">
これは逆で、閾値を超えた場合は最小値となり、そうでない場合は最大値となります。関数の実装は次のとおりです:
var CV_THRESH_BINARY_INV = function(__value, __thresh, __maxVal){
return __thresh ? :
};
しきい値の切り捨て
式は次のとおりです:
texttt{thresh}$}{texttt{src}(x,y)}{otherwise}" src="http://files.jb51.net/file_images/article/201301/2013010314344057.png" >
これは、しきい値を超えると切り捨てられることがわかります。関数の実装は次のとおりです:
var CV_THRESH_TRUNC = function(__value, __thresh, __maxVal){
__値を返す > __thresh :
};
しきい値を 0 に設定
式は次のとおりです:
画像表現は次のとおりです:
この場合、閾値より小さい値はすべて0となります。関数の実装:
var CV_THRESH_TOZERO = function(__value, __thresh, __maxVal){
__value を返す >
式は次のとおりです:
texttt{thresh}$}{texttt{src}(x,y)}{otherwise}" src="http://files.jb51.net/file_images/article/201301/2013010314344061.png" >
画像表現は次のとおりです:
コードをコピーします
コードは次のとおりです。 :
閾値処理機能実装
次に、画像全体に対して上記のような閾値処理を行う関数を作ります。
コードをコピー
コードは次のとおりです。
sData = __src.data,
dst = __dst || new Mat(height, width, CV_GRAY),
dData = dst.data、
maxVal = __maxVal || 255、
threShouldType = __thresholdType ||
var i, j, offset;高さ; i --;){
for(j = width; j--;){
オフセット = i * 幅 j;
dData[オフセット] = threShouldType(sData[オフセット], __thresh, maxVal);
}
}
}else{
error(arguments.callee, UNSPPORT_DATA_TYPE/* {line} */); dst;
};
この関数は比較的単純です。つまり、
コードをコピー
コードは次のとおりです。
threShouldType(sData[offset], __thresh, maxVal)
戻り値。