ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript 画像処理 - 画像の形態学 (膨張と収縮)_JavaScript スキル

JavaScript 画像処理 - 画像の形態学 (膨張と収縮)_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 17:44:361870ブラウズ
はじめに

前の記事 では、画像処理におけるしきい値関数について説明しました。今回は、拡張関数と腐食関数について説明します。

膨張と腐食

コンセプトを説明するのは難しいかもしれません。最初の写真を見てみましょう:

Original image

展開後は次のようになります:

Dilation result - Theory example

腐食後は次のようになります:

Erosion result - Theory example

少し不可解に思えるかもしれませんが、膨張であることは明らかですが、なぜ文字が薄くなり、腐食であることは明らかであるのに、なぜ文字が太くなるのでしょうか。

実際には、いわゆる展開は を参照する必要があります:

明るい色のブロックが拡大します。

いわゆる腐食とは、 を指します:

明るい色のブロックは腐食します。

上の写真では、白地が明るい色のブロックなので、膨張すると濃い黒のブロック上の文字が平らになってしまいます…逆に腐食すると文字が水を吸って膨張します…。 .

を数式で表すと :

端的に言えば、指定されたサイズのカーネル内で最も暗いピクセルまたは最も明るいピクセルを見つけて、カーネルのアンカー ポイント上のピクセルをこのポイントに置き換えることです。

を達成する

まず、拡張 dilate 関数を実装します。

コードをコピー コードは次のとおりです。

var dilate = function(__src, __size, __borderType, __dst ){
__src || error(arguments.callee, IS_UNDEFINED_OR_NULL/* {line} */);
if(__src.type && __src.type == "CV_RGBA"){
var幅 = __src .col、
高さ = __src.row、
サイズ = __size || 3、
dst = __dst || 新しい Mat(高さ、幅、CV_RGBA)、
dstData = dst。データ;

var start = size >> 1;
var withBorderMat = copyMakeBorder(__src, start, start, 0, 0, __borderType),
mData = withBorderMat.data,
mWidth = withBorderMat.col;

var newOffset、total、nowX、offsetY、offsetI、nowOffset、i、j;

if(size & 1 === 0){
error(arguments .callee, UNSPPORT_SIZE/* {line} */);
return __src;
}

for(i = height; i--;){
offsetI = i * 幅;
for(j = width; j--;){
newOffset = 0;
total = 0;
for(y = size; y--;) offsetY = ( y i) * mWidth * 4;
for(x = size; x--;){
nowX = (x j) * 4;
nowOffset = offsetY nowX; nowOffset] mData [nowOffset 1] mData[nowOffset 2] > total) && (total = mData[nowOffset] mData[nowOffset 1] mData[nowOffset 2]) && (newOffset = nowOffset);
dstData[(j offsetI) * 4] = mData[newOffset];
dstData[(j offsetI) * 4 1] = mData[newOffset 1];
dstData[(j offsetI) * 4 2 ] = mData [newOffset 2];
dstData[(j offsetI) * 4 3] = mData[newOffset 3]
}
}

}else{
error( argument.callee , UNSPPORT_DATA_TYPE/* {line} */);
}
return dst;


このコード行では、最初に RGB 値を使用します。最大値 total を比較し、新しい値の方が大きい場合は、新しい値を total に割り当て、新しいオフセット newOffset を現在のオフセット nowOffset に割り当てます。


その後、カーネル サイズの領域全体が循環された後、最大合計と対応するオフセット newOffset が見つかります。値を割り当てることができます:

dstData[(j offsetI) * 4] = mData[newOffset];dstData[(j offsetI) * 4 1] = mData[newOffset 1];
dstData[(j offsetI) * 4 2 ] = mData[newOffset 2];

dstData[(j offsetI) * 4 3] = mData[newOffset 3];


侵食関数はその逆で、最小値を見つけるだけです。

コードをコピー

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。