乐平市网站建设,宁波seo优化公司,电商网站成本,0453牡丹江信息网二手房买卖图像的阈值处理一幅图像包括目标物体、背景还有噪声#xff0c;要想从多值的数字图像中直接提取出目标物体#xff0c;常用的方法就是设定一个阈值T#xff0c;用T将图像的数据分成两部分#xff1a;大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法#xf…图像的阈值处理一幅图像包括目标物体、背景还有噪声要想从多值的数字图像中直接提取出目标物体常用的方法就是设定一个阈值T用T将图像的数据分成两部分大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法称为图像的二值化Binarization。阈值分割法的特点是:适用于目标与背景灰度有较强对比的情况重要的是背景或物体的灰度比较单一而且总可以得到封闭且连通区域的边界。
一简单阈值
选取一个全局阈值然后就把整幅图像分成非黑即白的二值图像。
函数为cv2.threshold( )
这个函数有四个参数第一个是原图像矩阵第二个是进行分类的阈值第三个是高于低于阈值时赋予的新值第四个是一个方法选择参数常用的有cv2.THRESH_BINARY黑白二值cv2.THRESH_BINARY_INV黑白二值翻转cv2.THRESH_TRUNC得到额图像为多像素值cv2.THRESH_TOZERO当像素高于阈值时像素设置为自己提供的像素值低于阈值时不作处理cv2.THRESH_TOZERO_INV当像素低于阈值时设置为自己提供的像素值高于阈值时不作处理
这个函数返回两个值第一个值为阈值第二个就是阈值处理后的图像矩阵。
img cv2.imread(4.jpg, 0)
ret, thresh1 cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # binary 黑白二值
ret, thresh2 cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) # 黑白二值反转
ret, thresh3 cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC) # 得到的图像为多像素值
ret, thresh4 cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO) # 高于阈值时像素设置为255低于阈值时不作处理
ret, thresh5 cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV) # 低于阈值时设置为255高于阈值时不作处理print(ret)cv2.imshow(thresh1, thresh1)
cv2.imshow(thresh2, thresh2)
cv2.imshow(thresh3, thresh3)
cv2.imshow(thresh4, thresh4)
cv2.imshow(thresh5, thresh5)
cv2.imshow(grey-map, img)
cv2.waitKey(0)
cv2.destroyAllWindows()二自适应阈值
一中的简单阈值是一种全局性的阈值只需要设定一个阈值整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值通过设定一个区域大小比较这个点与区域大小里面像素点 的平均值或者其他特征的大小关系确定这个像素点的情况。使用的函数为
# 第一个参数为原始图像矩阵第二个参数为像素值上限第三个是自适应方法adaptive method# -----cv2.ADAPTIVE_THRESH_MEAN_C:领域内均值# -----cv2.ADAPTIVE_THRESH_GAUSSIAN_C:领域内像素点加权和权重为一个高斯窗口# 第四个值的赋值方法只有cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV# 第五个Block size设定领域大小一个正方形的领域# 第六个参数C阈值等于均值或者加权值减去这个常数为0相当于阈值就是求得领域内均值或者加权值
# 这种方法理论上得到的效果更好相当于在动态自适应的调整属于自己像素点的阈值而不是整幅图都用一个阈值
img cv2.imread(4.jpg, 0)
ret, th1 cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 第一个参数为原始图像矩阵第二个参数为像素值上限第三个是自适应方法adaptive method
# -----cv2.ADAPTIVE_THRESH_MEAN_C:领域内均值
# -----cv2.ADAPTIVE_THRESH_GAUSSIAN_C:领域内像素点加权和权重为一个高斯窗口
# 第四个值的赋值方法只有cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV
# 第五个Block size设定领域大小一个正方形的领域
# 第六个参数C阈值等于均值或者加权值减去这个常数为0相当于阈值就是求得领域内均值或者加权值
# 这种方法理论上得到的效果更好相当于在动态自适应的调整属于自己像素点的阈值而不是整幅图都用一个阈值
th2 cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 2)
th3 cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
th4 cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow(img, img)
cv2.imshow(th1, th1)
cv2.imshow(th2, th2)
cv2.imshow(th3, th3)
cv2.imshow(th4, th4)
cv2.waitKey(0)
cv2.destroyAllWindows()对于第五个参数的窗口越来越小时发现得到的图像越来越细了可以设想如果把窗口设置的足够大的话不能超过图像大小那么得到的结果可能就和第二幅图像的相同了。
三Otsus二值化
cv2.threshold( )函数有两个返回值一个是阈值第二个是处理后的图像矩阵。
前面对于阈值的设定上我们选择的阈值都是127在实际情况中有的图像阈值不是127得到的图像效果更好。那么这里就需要算法自己去寻找一个阈值而Otsus就可以自己找到一个认为最好的阈值。并且Otsus非常适合于图像灰度直方图(只有灰度图像才有)具有双峰的情况。他会在双峰之间找到一个值作为阈值对于非双峰图像可能并不是很好用。那么经过Otsus得到的那个阈值就是函数cv2.threshold的第一个参数了。因为Otsus方法会产生一个阈值那么函数cv2.threshold( )的第二个参数设定阈值就是0了并且在cv2.threshold的方法参数中还得加上语句cv2.THRESH_OTSU.
在下列这些程序和图片中大家会有鲜明的体会
img cv2.imread(2.jpg, 0)
ret1, th1 cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 简单滤波
ret2, th2 cv2.threshold(img, 0, 255, cv2.THRESH_BINARYcv2.THRESH_OTSU) # Otsu 滤波
print(ret2)
cv2.imshow(img, img)
cv2.imshow(th1, th1)
cv2.imshow(th2, th2)
# 用于解决matplotlib中显示图像的中文乱码问题
plt.rcParams[font.sans-serif] [SimHei]
plt.rcParams[axes.unicode_minus] False
plt.hist(img.ravel(), 256)
plt.title(灰度直方图)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()