原理
- 膨張、出力ピクセル値は、構造要素によってカバーされる入力画像の最大ピクセル値です。
- 腐食、出力ピクセル値は、構造要素によってカバーされる入力画像の最小ピクセル値です。
膨張すると白が膨らみ、黒が縮みます。
腐食すると白が縮み、黒が膨らみます。
これは原理に基づいています。カーネルをスキャンすると、拡張はアンカーポイントを領域の最大値に置き換え、腐食はアンカーポイントを領域の最小
値に置き換えます。255は白で、最小値の0は黒です。
- 開操作:最初に腐食、次に膨張
- 閉鎖操作:最初に膨張し、次に腐食
開封操作は、最初に腐食し、黒い点を取り除き、次に拡大し、黒い塊は元の状態に戻ります。
クローズ操作は、最初に拡張してホワイトノイズを除去し、次に拡張してホワイトマスを復元します。
API
バイナリ画像を変換する
adaptiveThreshold(
Mat src, // 输入的灰度图像
Mat dest, // 二值图像
double maxValue, // 二值图像最大值(255)
int adaptiveMethod // 自适应方法,只能其中之一 –
// ADAPTIVE_THRESH_MEAN_C , ADAPTIVE_THRESH_GAUSSIAN_C
int thresholdType,// 阈值类型
int blockSize, // 块大小
double C // 常量C 可以是正数,0,负数
)
といった
adaptiveThreshold(~gray, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
構造要素を定義する
Mat getStructuringElement(
int shape,
Size ksize,
Point anchor = Point(-1,-1)
);
(1)Int型の形状、要素の形状は、cv :: MorphShapesのいずれかになります。
(2)Sizeタイプのksize、構造化要素のサイズ。
(3)ポイントタイプのアンカー(デフォルト値(-1、-1))は、アンカーが中央に配置されていることを意味します。十字型要素の形状のみがアンカー位置に依存することに注意してください。その他の場合、アンカーは形態学的操作から生じる動きの量を調整するだけです。
最初のパラメータにはいくつかのオプションがあります
-(1)MORPH_RECT:長方形の構造領域。
-(2)MORPH_CROSS、十字型の構造領域。
-(3)MORPH_ELLIPSE、楕円構造領域、長方形Rect(0、0、esize.width、0。esize.height)に内接する塗りつぶされた楕円。
コード
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat src;
src = imread("C:/Users/86176/Pictures/pics/chars.png");
if (!src.data)
{
printf("fail to read the pic\n");
}
namedWindow("src", CV_WINDOW_AUTOSIZE);
imshow("src", src);
/*转化为灰度图*/
Mat gray;
if (src.channels() == 3)
{
cvtColor(src, gray, CV_BGR2GRAY);
}
else
{
gray = src;
}
imshow("gray pic ", gray);
//转化为二值图像
Mat binImg;
adaptiveThreshold(~gray, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);//如果不取反就选用闭操作
imshow("binImg", binImg);
//定义结构元素
Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3), Point(-1,-1) );
//开操作
Mat dst;
morphologyEx(binImg, dst, CV_MOP_OPEN, kernel);
//优化后输出
Mat dsty, dstx;
//blur(ydst, dsty, Size(3,3), Point(-1,-1));
imshow("dst", dst);
waitKey(0);
return 0;
}
効果
総括する
操作を開いて腐食拡張APIを呼び出し、カーネルサイズをデバッグすると、効果が向上します。