unmix
手順は排除するために使用される「画素エイリアシング」を いわゆるエイリアシング画素、一部の画素が直ちにエッジラインを横切るので、画素上に結像自然シーン画像、CMOSエッジラインの値です。
このような特徴は、Rが、G、Bの三色の画素勾配値が矛盾している画素です。例えば、CMOSは、各ピクセルの色は、その配列順序左から右にソートされるR、G、B三色センサを有します。
だから、傾斜したエッジ画素位置G、及び次いで三色の勾配値は異なる稜線部、オブジェクトの下部の背景、博士> dBでのちょうど一行、そうでない場合はデシベル> DRが存在する場合.. このような
ピクセルは、我々はunmixによってそれを排除することができます。この方法は、それが、画素勾配画素置換の、同一又は類似の画素近傍であり、非常にシンプルです。ここで、コードは次のとおりです。
Unmixマット(CONSTマット&IMG、neibourSizeをINT) { MAT imgCopy img.clone =(); INT = NR neibourSize / 2; INT COLS = img.cols、行= img.rows; MAT kernel_x =(Mat_ <整数>(1、。 2)<< - 1,1); マットkernel_y =(Mat_ <整数>(2,1)<< - 1,1)、 マットimg_dx、img_dy; //事前宣言勾配行列X、Y方向 filter2D(IMG 、img_dx、CV_32F、kernel_x); filter2D(IMG、img_dy、CV_32F、kernel_y); マット勾配= ABS(img_dx)+ ABS(img_dy); マットシータ= getGradientDirect(img_dy、img_dx); //この関数は、参照します。https: //www.cnblogs.com/phoenixdsg/p/11352623.html マットthetaGray; cvtColor(シータ、thetaGray、COLOR_RGB2GRAY); //容易にするために、グレースケール画像の処理に変換 /// unmix()関数を (iは= NR int型のために、私は、-NR行を<; Iは++します) { 用(INT J = NR; J <COLS-NR; J ++) { フロート* PG = CV_MAT_ELEM2(勾配、フロート、I、J); フロートR&LT = PG [2]、Gは、Pgは、BはPGを[= = [1] 2]; IF(!! R&LT B = G = R&LT || || B = G!) { マットthetaGray TMP =(のRect(J-NR、NR-I、neibourSize、neibourSize)); マットTMPR = tmp.clone (); //隣接画素採取 フロートPijを= *(CV_MAT_ELEM2(thetaGray 、フロート、I、J)); // 現在の画素値取得 TMPR = ABSを(TMPR-Pijにある); tmpr.at <a float>(NR、 NR)= 7; ダブルMINV、 ポイントMINLOC; minMaxLoc(TMPR、&MINV、0、&MINLOC); MINLOC =ポイント(NR、NR)-minLoc。 // << COUT "MINV =" << << MINV ";" // <<" MINLOC =" << MINLOC <<てendl; int型II = minLoc.y + I、JJ = minLoc.x + J; 用(int型のk = 0; K <3; kは++) { imgCopy.ptr <Vec3b>(I)[J] [K] = img.ptr <Vec3b>(II)[JJ] [K]。 } } } } 戻りimgCopy。 }
この関数は2つのパラメータを取り、最初の画像が処理される、第二のパラメータは近傍サイズであり、大きさが3,5,7のような奇数でなければなりません。、unmixの結果である関数の戻り値は、。
条件付き平均
現在のピクセルNセット0隣接する画素の組が有効画素S、{ニッケル}から選択される、Sです。平均有効画素N取得0」、及び代替N 0。
{式中、n = S I:| N I = N 0 | <T}。Nは有効画素数です。それは常にS N含まれています0を。プログラムは次のような効果を持つことになります。
1)均質な領域において、ノイズの少ない平滑化、ノイズの相対値がT未満です。
2)境界領域の近傍に、コントラストが処理なし境界の画素が平均だけを横切って、Tよりも大きいです。そう画像を平滑化、境界画素の側面のみを処理のために意味します。
これでも普通の平均ファジー境界もぼやけてきた、通常のファジー平均値と異なっています。
3)それは、勾配範囲を平滑化するノイズだけではなく、勾配を滑らかにしません。
T未満のテクセル()との間の小さな差がある場合4)テクスチャ領域において、その後のピクセル、すなわちテクスチャを除去するために、通知領域として平滑であろう。
Tより大きいテクセル差場合、プロセスは、滑らかではありません。
コードは以下の通りであります:
conditionalAerage(マット&IMG、INT T)無効 { 行INT = img.rows、COLS = img.colsと、 int型neighborSize = 3; int型NR = neighborSize / 2; (; iが行-NRを<I ++は、I = NR INT)のために { ため(INT J = NR; J <COLS-NR; J ++) { int型CTN = 0。 ベクトル<Vec3b> NV; Vec3b P0 = img.at <Vec3b>(i、j)は、 フロートP0m =フロート(P0 [0] + P0 [1] + P0 [1])/ 3; (; <neighborSizeで; = I-NRのint ++で)のために { ため(INT JN = I-NR; JN <neighborSize; JN ++) { Vec3b Pnの= img.at <Vec3b>(JN、IN)。 Pnmを=フロートフロート(PN [0] + Pnを[1] + Pnの[1])/ 3; (ABS(Pnmを-P0m)<T)であれば { nv.push_back(PN)。 } } Vec3b和(0,0,0)。 CTN = nv.size()。 用(int型V = 0; V <CTN; V ++) { 合計+ = NV [V]。 } Vec3b AVER =和/ CTN。 (あり、k <img.channels(); int型のk = 0 ++ k)に対する img.at <Vec3b>(i、j)は[K] = [K]を断言。 } } } }