形態学的研究は-opencv-ノート
一般的な形態学的操作が含まれる:膨張は、腐食の最も基本的な方法であることを特徴とする請求侵食、拡張、開放動作及び閉鎖動作、トップハット動作、操作の他のボトムキャップを、。
腐食
分析の原則
画像の腐食は、近傍位置の最小出力値の各座席位置のために選択されます。近傍は、矩形構造であってもよいし、構成要素の大部分が定義されている、構成を十字形、楕円形構造であってもよいです。
各近傍の最小値を選択し、画像の明るさは、画像領域内の明るい領域を低減あるいは消滅され、腐食を減少させます。画像I、構造要素Sと呼ばれるエッチング操作の:
縮小輝度エッチング操作領域の画像領域は、によって、図の前景のための閾値の後にバイナリランダム白色であります
境界線を抽出する操作。
実装コード
画像OpenCVのために腐食機能を提供します。
erode(src, element[,dst[,iterations[,borderType[,borderValue]]]])
//src 输入矩阵
//element 结构元
//anchor 结构元的锚点
//iterations 迭代的次数
//borderType 边界扩充类型
//borderValue 边界扩充值
範囲外のため、画像の境界、最善の方法ミラーを展開する必要があります。構造要素パラメトリック要素を表し、OpenCVのは、機能を提供します。
getStructuringElement(shape, ksize[,anchor])
//shape MORPH_RECT:产生矩形结构元
// MORPH_ELLIPSEM:产生椭圆结构元
// MORPH_CROSS:产生十字交叉结构元
//ksize 结构元尺寸
//anchor 结构元锚点
浸食及びエッチング操作用いGetStrcturingElement機能:
if __name__ =='__main__':
#loading image
image=cv2.imread("G:\\blog\\OpenCV_picture\\chapter6\\img7.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("image",image)
#Entropy threshold
thresh,out=threshEntroy(image)
#show thresh
print(thresh)
out=np.round(out)
out.astype(np.uint8)
#erode
#create element
element = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
#erode image, iterations set 1
erodeImg = cv2.erode(out, element)
#border extraction
bordeExtractionImg = out - erodeImg
cv2.imshow("out",out)
cv2.imshow("erodeImage", erodeImg)
cv2.imshow("border extraction image", bordeExtractionImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
結果:
[画像ソースステーションは、セキュリティチェーン機構を有していてもよい、チェーンが失敗したダンプ、それはダウン直接アップロード画像を保存することをお勧めします(IMG-7h40f80j-1571986151633)(C:\ Users \ユーザーhuangxinデスクトップ\アフィン変換の\ OpenCVのアルゴリズム\簡潔-7 \ 1.png)]
C ++エッチング操作:
//创建结构元
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
//进行2次腐蚀操作
Mat erodeImage1, erodeImage2;
erode(OtsuMat, erodeImage1, element, Point(-1, -1), 2);
erode(threshByEntroyMat, erodeImage2, element, Point(-1, -1), 2);
//显示图片
imshow("src", src);
imshow("dst", thresh_out_dst);
imshow("threshByEntroy", threshByEntroyMat);
imshow("Otsu", OtsuMat);
imshow("erode after Otsu", erodeImage1);
imshow("erode after threshByEntroy", erodeImage2);
結果:
[画像ソースステーションは、セキュリティチェーン機構を有していてもよい、チェーンが失敗したダンプ、それはダウン直接アップロード画像を保存することをお勧めします(IMG-y6V1KLkY-1571986151634)(C:\ Users \ユーザーhuangxin \デスクトップ\アフィン変換の\ OpenCVのアルゴリズム簡潔-7 \ 2.png)]
構造要素のサイズを大きくし、対象物の白色領域が小さく、エッチング動作が繰り返され、白い領域が小さくなります。
うねり
腐食は同様であったが、地域の最大値を取得し、拡張後、明るい領域が増加される、画像の明るさを増加させるであろう。画像Iと構造要素S膨張動作と呼ばれます。
コードの実装
open'c'v提供DILATE関数()
dilate(src, element[,dst[,iterations[,borderType[,borderValue]]]])
//src 输入矩阵
//element 结构元
//anchor 结构元的锚点
//iterations 迭代的次数
//borderType 边界扩充类型
//borderValue 边界扩充值
if __name__=="__main__":
image=cv2.imread("G:\\blog\\OpenCV_picture\\chapter6\\img7.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("init iamge", image)
#结构元半径,迭代次数
radius, iterationsNum = 1, 1
MAX_R, MAX_Iter = 20, 20
#显示膨胀窗口
cv2.namedWindow("dilate", 1)
def nothing(*arg):
pass
#调节结构圆半径
cv2.createTrackbar("radius", "dilate", radius, MAX_R, nothing)
cv2.createTrackbar("iterations", "dilate", iterationsNum, MAX_Iter, nothing)
while True:
#获得当前的半径值
radius = cv2.getTrackbarPos("radius", 'dilate')
iterationsNum = cv2.getTrackbarPos("iterations", "dilate")
#创建结构元
element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2*radius+1, 2*radius+1))
#膨胀图像
dilateImg = cv2.dilate(image, element, iterations=iterationsNum)
#显示膨胀效果
cv2.imshow("dilate", dilateImg)
ch = cv2.waitKey(5)
#按下Esc键退出
if ch == 27:
break
cv2.destroyAllWindows()
"S = cv2.getStructuringElement(cv2.MORPH_OPEN、(2本のコードでなおR&LT 1,2 +。R&LT + 1))"エラーがcv2.cv2.MORPH_ELLIPSEについて説明した他の番組が表示され、「エラー: (-215:アサーションが失敗した)anchor.inside(のRect(0、0、ksize.width、ksize.height))機能で'CV :: normalizeAnchor'
問題は、whileループの私のcv2.destroyAllWindows()は半径値を起こし、内部の書き込みをして戻って反復を取得することはできませんので、場所を見つけます。
このサイズが大きくなければならない、またはエラーが意志より3×3の要素の最小サイズ、
int radius = 1;
int MAX_R = 20;
Mat image, outImg;
//回调函数,调节半径
void callBack(int, void *)
{
//创建只有垂直方向上的矩形结构元
Mat element = getStructuringElement(MORPH_RECT, Size(1, 2 * radius + 1));
dilate(image, outImg, element);
imshow("dilate", outImg);
}
int main()
{
//输入图像
std::string imagePath = "G:\\blog\\OpenCV_picture\\chapter6\\img7.jpg";
Mat src = imread(imagePath, 0);
if (!src.data)
{
std::cout << "load image error!" << std::endl;
return -1;
}
Mat thresh_out_dst;
int ret = 0;
ret = threshTwoPeaks(src, thresh_out_dst);
if (!ret)
{
return -1;
}
cout << ret << endl;
Mat threshByEntroyMat;
ret = threshByEntroy(src, threshByEntroyMat);
if (!ret)
{
return -1;
}
cout << ret << endl;
Mat OtsuMat;
ret = Otsu(src, OtsuMat);
if (!ret)
{
return -1;
}
cout << ret << endl;
imshow("Otsu", OtsuMat);
waitKey(0);
OtsuMat.copyTo(image);
//image=OtsuMat.clone();
imshow("img", image);
namedWindow("dilate", WINDOW_AUTOSIZE);
createTrackbar("radius", "dilate", &radius, MAX_R, callBack);
callBack(0, 0);
waitKey(0);
return 0;
}
結果:
[画像ソースステーションは、セキュリティチェーン機構を有していてもよい、チェーンが失敗したダンプ、それはダウン直接アップロード画像を保存することをお勧めします(IMG-Jilr78rT-1571986151636)(C:\ Users \ユーザーhuangxin \デスクトップ\アフィン変換の\ OpenCVのアルゴリズム簡潔-7 \ 4.png)]
OstuMat Ostuは、画像閾値を取得ここ以上があります。
操作を開くと操作を閉じます
腐食の間に展開する操作を開きます。
小領域内高輝度、薄い点で分別対象物を排除し、より大きな目的のために、スムーズように領域の場合には目立たない境界を変更するとすることができます。
開閉動作は、第1膨張をエッチングすることにより行われます。
これは、キャビティ領域内の黒微細な白色物体を充填することができる、接続オブジェクト、同じ構造要素に隣接して、複数の処理は、境界が大幅ようにその滑らかな領域を変更し、場合であってもよいです。
OpenCVのは、機能norphologyEx()関数を提供します
norphologyEx(src, op, element[,dst[, anchor[iterations[,borderType[,borderValue]]]]])
//src 输入矩阵
//op 形态学处理的各种运算
// NORPH_OPEN 开运算
// NORPH_CLOSE 闭运算
// NORPH_GRADIENT 形态梯度
// NORPH_TOPHAT 顶帽运算
// NORPH_BLACKHAT 底帽运算
//element 结构元
//iterations 迭代次数
//anchor 结构元锚点
if __name__ == "__main__":
image = cv2.imread("G:\\blog\\OpenCV_picture\\chapter7\\img1.jpg", 0)
cv2.imshow("InitImage", image)
#结构元半径
radius, iter = 1, 1
MAX_R, MAX_Iter = 20, 20
#
cv2.namedWindow("morphology", 1)
def nothing(*arg):
pass
cv2.createTrackbar("radius", "morphology", radius, MAX_R, nothing)
cv2.createTrackbar("iterations", "morphology", iter, MAX_Iter, nothing)
while True:
radius = cv2.getTrackbarPos("radius", "morphology")
iter = cv2.getTrackbarPos("iterations", "morphology")
element = cv2.getStructuringElement(cv2.MORPH_RECT,(2*radius+1, 2*radius +1))
photoMorphology = cv2.morphologyEx(image, cv2.MORPH_OPEN,element,iterations=iter)
cv2.imshow("morphology", photoMorphology)
ch = cv2.waitKey(5)
if ch == 27:
break
cv2.destroyAllWindows()
業績[写真のチェーン失敗外にダンプし、発信局直接ダウンアップロードした写真を保存することが推奨され、セキュリティチェーン機構を有していてもよい(IMG-vBQSaH8w-1571986151637)(C:\ Users \ユーザーhuangxin \デスクトップ\アフィン変換の\ OpenCVのアルゴリズム簡潔-7 \ 5.png)]
開動作が暗い背景の明るい領域を排除し、白色の明るい領域を除去するために、領域の場合に顕著に変化しません。操作を閉じると明るい領域内の暗い領域を除去することです
トップハット変換
トップハットの画像を定義する開放動作を減算した結果に変換します
オープンオペレータは、暗い背景に明るい領域を削除することができます。方法オープンオペレータ明るい灰色の領域、より正の効果照明ムラの一つを差し引いた画像。また、白いシルクハットとして知られている変換
ボトムハット変換
閉鎖を減算する画像演算結果を画定する端部キャップ
開放動作が暗い領域明るい背景に除去することができます。また、ブラックトップハットとしても知られている灰色の領域、暗いオープンオペレータ変換方法を差し引いた画像
形態学的グラデーション
形態学的勾配は膨張の腐食の結果を減算することによって定義され、拡張近傍最大値、雨腐食の最小値は、高輝度、低輝度被写体の境界を引きました。
OPの修正値に設けMorphologyExのOpenCVの関数は、頂部キャップ、底部キャップ動作、勾配形態を実現することができます
//输入图像
Mat I;
//输出图像
Mat d;
//结构元
Mat element;
string window = "形态学处理";
//结构元半径
int r = 1;
int MAX_R = 20;
//迭代次数
int i = 1;
int MAX_I = 20;
//回调函数,调节r和i
void callBack(int, void*)
{
//创建结构元
element = getStructuringElement(MORPH_RECT, Size(2 * r + 1, 2 * r + 1));
//形态学处理
morphologyEx(I, d, cv::MORPH_TOPHAT, element, Point(-1, -1), i);
//显示形态处理的效果
imshow(window, d);
}
int main(int argc, char*argv[])
{
//输入图像
I = imread("G:\\blog\\OpenCV_picture\\chapter7\\open.jpg", 0);
if (!I.data)
return 0;
//显示原图
imshow("原图", I);
//创建显示形态学结果显示窗口
namedWindow(window, 1);
//创建调节r的进度条
createTrackbar("半径", window, &r, MAX_R, callBack);
//创建调节i的进度条
createTrackbar("迭代次数", window, &i, MAX_I, callBack);
callBack(0, 0);
waitKey(0);
return 0;
}
ランの写真:
{
//入力画像
I =関数imread( "G:\ブログ\ OpenCV_picture \第7章\ open.jpg"、0);
IF(!I.Data)
戻り0;
//表示画面
imshowは( "アートワーク"、I );
//表示ウィンドウは、形態素の結果表示を作成
、namedWindow(ウィンドウ,. 1)
//はRのプログレスバー調整作成
createTrackbar(「半径」、窓、&R、MAX_R、コールバック);
// iは、調整可能のプログレスバー作成
createTrackbarを( "反復"、窓、&I、MAX_I、コールバック);
コールバック(0、0);
waitKey(0);
戻り0;
}
运行图片:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qG5oqqdk-1571986151638)(C:\Users\huangxin\Desktop\仿射变换\opencv算法精讲-7\6.png)]