十五 open CV 教程 形态学二值化和腐蚀操作
一、形态学概述
指一系列处理图像形状特征的图像处理技术。形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。
”方法基本是对二进制图像进行处理,即黑白图像
卷积核决定着图像处理后的效果
形态学常用基本操作有:
1、膨胀和腐蚀
2、 开运算
3、闭运算
4、顶帽
5、 黑帽
二、 图像全局二值化
threshold英 [ˈθreʃhəʊld] 门槛;门口;出入口;起点;开端;开始;阈限
二值化:将图像的每个像素变成两种值,比如0,255.
threshold(src, dst,thresh, maxval, type[, dst])
thresh大黑的多,小白的多
threshold 函数
retval, dst = cv2.threshold( src, thresh, maxval, type )
其中
thresh 表示要设定的阈值
maxval 表示当type 参数为 THRESH_BINARY 或者 THRESH_BINARY_INV 时,需要设定的最大值
type 表示阈值分割的类型(常见的有如下5种)
cv2.THRESH_BINARY 高于阈值为255,低于阈值值为0
cv2.THRESH_BINARY_INV 高于阈值为0,低于阈值值为255
cv2.THRESH_TRUNC 截断,高于thresh,其值变为阈值
cv2.THRESH_TOZERO 变0,低于阈值的,其值变为0
cv2.THRESH_TOZERO_INV 超阈值变为0
三、自适应阈值二值化
全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。
adaptiveThreshold(src,dst, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
这种方法需要我们指定六个参数,
Adaptive Method-指定计算阈值的方法。
ADPTIVE THRESH_MEAN_C:阈值取自相邻区域的平均值
ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。
Block Size-邻域大小(用来计算阈值的区域大小)。
C-这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。
四、OTSU大津阈值处理
OTSU方法可以根据当前图像找到最佳的类间分割阈值。OTSU方法会遍历所有可能的阈值,从而找到最佳的阈值,该方法本质是使得类间方差最大。
注意:在使用 Otsu 方法时,要把阈值设为 0。 此时的函数 cv2.threshold()会自动寻找最优阈值,并将返回该阈值。
t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
与普通阈值分割的不同之处在于:
参数 type 增加了一个参数值“cv2.THRESH_OTSU”设定的阈值为 0返回值 t 是 Otsu 方法计算得到并使用的最优阈值
五、腐蚀操作
腐蚀操作也是用卷积核扫描图像,只不过腐蚀操作的卷积和一般都是1,如果卷积核内所有像素点都是白色,那么锚点即为白色.
函数支持就地模式,腐蚀操作可以迭加使用多次,在多通道图像的情况下,每个通道独立处理。
函数原型
CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
参数描述
参数 src 输入图像;通道的数量可以是任意的,但是深度值应该是以下之一:
CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
参数 dst 和源图像同样大小和类型的输出图像。
参数 kernel 用于腐蚀的结构元素;如果element=Mat(),是一个3 x 3的矩形结构元素. Kernel 可以通过使用getStructuringElement来创建。
参数 anchor 素中的锚点的位置,默认是值(-1,-1),也就是说锚点在元素的中心位置。
参数 iterations 腐蚀的迭代次数。
参数 borderType像素外推方法。参见#BorderTypes, BORDER_WRAP不支持。
参数 borderValue 固定边缘的情况下的边缘值。
参考 dilate, morphologyEx, getStructuringElement
五、 获取形态学卷积核
opencv提供了获取卷积核的api.不需要我们手工创建卷积核.
getStructuringElement(shape, ksize[, anchor])
shape是指卷积核的形状,注意不是指长宽,是指卷积核中1形成的形状.
MORPH RECT卷积核中的1是矩形,常用.
MOBPH_ELLIPSE 椭圆
MORPH GROSS十字
void myCV::thresholdtest()
{//转为灰度图像Mat dst, src = imread("05.jpg", IMREAD_GRAYSCALE);//全局二值化//threshold(src, dst, 127, 255, THRESH_BINARY);//自适应阈值二值化//adaptiveThreshold(src, dst, 125, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 3, 0);//腐蚀操作,将有黑点的区域全变黑。/*Mat kernel = Mat::ones(Size(4, 4), CV_8UC1);erode(src, dst, kernel,Point(-1,-1),3);*///获取形态学卷积核,腐蚀操作。Mat kernel = getStructuringElement(MORPH_RECT, Size(8, 8));erode(src, dst, kernel,Point(-1,-1),1);imshow("dst", dst);
}