小言_互联网的博客

在OpenCV里实现全局阈值分割5

588人阅读  评论(0)

接着下看THRESH_TRIANGLE 算法,三角法求阈值最早见于Zack的论文《Automatic measurement of sister chromatid exchange frequency》主要是用于染色体的研究,该方法是使用直方图数据,基于纯几何方法来寻找最佳阈值,它的成立条件是假设直方图最大波峰在靠近最亮的一侧,然后通过三角形求得最大直线距离,根据最大直线距离对应的直方图灰度等级即为分割阈值,图示如下:

对上图的详细解释:

在直方图上从最高峰处bmx到最暗对应直方图bmin(p=0)%构造一条直线,从bmin处开始计算每个对应的直方图b到直线的垂直距离,知道bmax为止,其中最大距离对应的直方图位置即为图像二值化对应的阈值T。

 

下面使用例子来测试这个自动找阈值的算法:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np

#图像数据
src = np.array([[100, 157, 245], [20, 51, 250], [50, 2, 200]], np.uint8)
#阈值处理
retval, dst = cv2.threshold(src, 0, 255, cv2.THRESH_BINARY|cv2.THRESH_TRIANGLE)

print(src)
print(retval,'\n', dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

[[100 157 245]

 [ 20  51 250]

 [ 50   2 200]]

4.0

 [[255 255 255]

 [255 255 255]

 [255   0 255]]

从结果中可以看到,这个算法找到的阈值为4。接着下来看班马的例子:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np

#图片的路径
imgname = "imgbin1.png"

#读取图片
image = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)

#图片的高度和宽度
h,w = image.shape[:2]
print('imagesize={}-{}'.format(w,h))

#显示原图
cv2.imshow("Image",image)

#阈值分割
retval, out = cv2.threshold(image, 100, 255, cv2.THRESH_BINARY|cv2.THRESH_TRIANGLE)
print(retval)
cv2.imshow("out",out)


cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

输入图片

输出图片

在这个算法里,与前面一个算法相比,找到阈值差别很大,相比较来看是THRESH_OTSU算法比较好一些。

https://blog.csdn.net/caimouse/article/details/51749579


转载:https://blog.csdn.net/caimouse/article/details/101449994
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场