OpenCV erode 関数: cv2.erode() を使用

§ 侵食()

void cv::erode ( 入力配列 src
出力配列 dst
入力配列 カーネル
アンカー =  Point(-1,-1),
整数  反復 =  1
整数  ボーダータイプ =  BORDER_CONSTANT,
const スカラー &  境界値 = morphologyDefaultBorderValue() 
)
パイソン:
dst = cv.erode( src、カーネル[、dst[、アンカー[、反復[、ボーダータイプ[、ボーダー値]]]]] )

特定の構造化要素を使用してイメージを腐食させます。

この関数は、最小値を取るピクセル近傍の形状を決定する指定された構造要素を使用して、ソース イメージを侵食します。

この関数はインプレース モードをサポートします。Erosion は複数回 (繰り返し) 適用できます。マルチチャンネル画像の場合、各チャンネルは個別に処理されます。

パラメータ

ソース 入力画像。チャネル数は任意で、画像タイプは次のいずれかのタイプにする必要があります: CV_8U、CV_16U、CV_16S、CV_32F、または CV_64F。
dst SRC と同じサイズとタイプの出力イメージ。
カーネル 侵食に使用する構造要素; element=Mat() の場合、3 x 3 の長方形の構造要素を使用します。カーネルは getStructuringElement 関数を使用して取得できます。
アンカー 要素内のアンカー ポイントの位置。デフォルト値 (-1, -1) は、アンカー ポイントが要素の中心にあることを意味します。
反復 腐食を適用する回数。
ボーダータイプ ピクセル外挿、 BorderTypesを参照 
境界値 境界線が一定の場合の境界値

こちらもご覧ください

dilate、  morphologyEx、  getStructuringElement

例:

morphology2.cpp、  Morphology_1.cpp、および segment_objects.cpp

上記のアイコンは、opencv の公式ドキュメントからのものです。


以下は、構造要素の取得に焦点を当てています. 公式ドキュメントでは、cv2.getStructuringElement 関数を使用して取得することを推奨しています. この関数は、3 種類の構造要素を生成できます。

cv.MORPH_RECT 長方形、腐食した画像の詳細は長方形です

 

 

cv.MORPH_CROSS クロスタイプ、腐食画像の詳細はクロスタイプになります

 

 

cv.MORPH_ELLIPSE 楕円、腐食した画像の詳細は楕円形に見えます

 

 上記の 3 種類の構造要素に加えて、構造要素を自分で設定することもできます。次に例を示します。

kernel=(1,1,1,1) は 4*1 の列ベクトルで、画像の詳細は腐食後に垂直バーとして表示されます

 

kernel=np.array([[1, 1, 1, 1]], dtype=np.uint8)) 、2 つの [][] は 1*4 行ベクトルで、腐食後の画像の詳細は水平として表示されますストライプ

 Note: The cv2.erode() function defaults to white as the foreground target and black as the background. すべての腐食操作オブジェクトは白い部分で動作します。つまり、腐食は白いターゲット領域を小さくします。上記の例では、白い部分が点数が多く、黒い部分がクラック部分、腐食した物体が白い背景部分なので、白い部分が減り、黒い部分が増えます。

コード:

import numpy as np
import cv2 as cv

image = cv.imread('gkbuhxb5pe.jpg')  # 读取图片,默认为彩色图片
imgGray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)  # 转换为灰度图像
imgGaussBlur = cv.GaussianBlur(imgGray, ksize=(3, 3), sigmaX=2)  # sigmaX:x 轴方向的高斯核标准差
binaryGaussian = cv.adaptiveThreshold(imgGaussBlur, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 7, 6)  # 局部自适应阈值二值化


kernel_RECT = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))  # 生成腐蚀结构元素
print('kenerl_RECT=')
print(kernel_RECT)
kernel_CROSS = cv.getStructuringElement(cv.MORPH_CROSS, (5, 5))  # 生成腐蚀结构元素
print('kenerl_CROSS=')
print(kernel_CROSS)
kernel_ELLIPS = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))  # 生成腐蚀结构元素
print('kenerl_ELLIPS=')
print(kernel_ELLIPS)
binary_Erode1 = cv.erode(binaryGaussian, kernel=kernel_RECT)  # 腐蚀操,二值图像
binary_Erode2 = cv.erode(binaryGaussian, kernel=kernel_CROSS)  # 腐蚀操,二值图像
binary_Erode3 = cv.erode(binaryGaussian, kernel=kernel_ELLIPS)  # 腐蚀操,二值图像
binary_Erode4 = cv.erode(binaryGaussian, kernel=(1, 1, 1, 1))  # 腐蚀操,二值图像,kernel=(1,1,1,1)默认为一个4*1列向量
binary_Erode5 = cv.erode(binaryGaussian, kernel=np.array([[1, 1, 1, 1]], dtype=np.uint8))  # 腐蚀操,二值图像,两个[][]的是1*4的行向量

cv.namedWindow('image', 0)  # 设置窗口大小
cv.imshow('image', image)  # 显示图片
cv.waitKey(0)
cv.namedWindow('binary_Erode1', 0)  # 设置窗口大小
cv.imshow('binary_Erode1', binary_Erode1)  # 显示图片
cv.waitKey(0)
cv.namedWindow('binary_Erode2', 0)  # 设置窗口大小
cv.imshow('binary_Erode2', binary_Erode2)  # 显示图片
cv.waitKey(0)
cv.namedWindow('binary_Erode3', 0)  # 设置窗口大小
cv.imshow('binary_Erode3', binary_Erode3)  # 显示图片
cv.waitKey(0)
cv.namedWindow('binary_Erode4', 0)  # 设置窗口大小
cv.imshow('binary_Erode4', binary_Erode4)  # 显示图片
cv.waitKey(0)
cv.namedWindow('binary_Erode5', 0)  # 设置窗口大小
cv.imshow('binary_Erode5', binary_Erode5)  # 显示图片
cv.waitKey(0)

cv.imwrite('D:/binary_Erode1.jpg', binary_Erode1)  # 保存图像文件
cv.imwrite('D:/binary_Erode2.jpg', binary_Erode2)  # 保存图像文件
cv.imwrite('D:/binary_Erode3.jpg', binary_Erode3)  # 保存图像文件
cv.imwrite('D:/binary_Erode4.jpg', binary_Erode4)  # 保存图像文件
cv.imwrite('D:/binary_Erode5.jpg', binary_Erode5)  # 保存图像文件

おすすめ

転載: blog.csdn.net/syluxhch/article/details/129819577