建设专业网站排名,绵阳做seo网站公司,织梦网站如何做地区分站,51link友链一. Triangle方法 
算法描述#xff1a;三角法求分割阈值最早见于Zack的论文《Automatic measurement of sister chromatid exchange frequency》主要是用于染色体的研究#xff0c;该方法是使用直方图数据#xff0c;基于纯几何方法来寻找最佳阈值#xff0c;它的成立条件…一. Triangle方法 
算法描述三角法求分割阈值最早见于Zack的论文《Automatic measurement of sister chromatid exchange frequency》主要是用于染色体的研究该方法是使用直方图数据基于纯几何方法来寻找最佳阈值它的成立条件是假设直方图最大波峰在靠近最亮的一侧然后通过三角形求得最大直线距离根据最大直线距离对应的直方图灰度等级即为分割阈值图示如下 三角几何化的过程。首先找到直方图中灰度值最高的一点并判别亮暗然后找到最左边点两点连接一条直线求直方图上离直线最远的点设置该点的灰度值为阈值。 
有时候最大波峰对应位置不在直方图最亮一侧而在暗的一侧这样就需要翻转直方图翻转之后求得值用255减去即得到为阈值T。扩展情况的直方图表示如下 算法特点适用于单峰。这点和OTSU算法有很大区别OTSU适用于双峰。 
cv2中有三角分割的算法直接使用即可。 
import cv2
import matplotlib.pylab as pltdef main():img  cv2.imread(6.jpg, 0)ret, thresh1  cv2.threshold(img, 0, 255, cv2.THRESH_TRIANGLE)print(ret)  # 结果是151.0titles  [Original Image, After Binarization]images  [img, thresh1]for i in range(2):plt.subplot(1, 2, i  1)plt.imshow(images[i], gray)plt.title(titles[i])plt.xticks([])plt.yticks([])plt.show()main() 二. Maxentropy方法 
最大熵阈值分割法和OTSU算法类似假设将图像分为背景和前景两个部分。熵代表信息量图像信息量越大熵就越大最大熵算法就是找出一个最佳阈值使得背景与前景两个部分熵之和最大。 
给定一个大小为M*N的图像直方图中所有矩形框所代表的数值之和即为图像中的像素数量设像素值i的像素在图中有个即 相对应的归一化直方图表示为 其中0iK。通常被解释为一个随机过程的概率分布或概率密度函数表示的是图像中像素灰度值为i所出现的概率。i的累积概率值为1即概率分布p必须满足以下关系 与累积概率所对应的累积直方图H是一个离散的分布函数P()通常也称为累积分布函数或cdfPi表示像素值小于等于i的概率 在图像处理中灰度图的熵定义如下 因为所以。 
利用图像熵为准则进行图像分割有一定历史了学者们提出了许多以图像熵为基础进行图像分割的方法。以下介绍一种由Kapuret al提出来现在仍然使用较广的一种图像熵分割方法。 
给定一个特定的阈值q(0qK-1)对于该阈值所分割的两个图像区域C0C1这两部分的熵可写为 其中。 
图像总熵为。现在就是要遍历q(0qK-1)使得Hq最大。 
为了计算方便对H0和H1的表达式进行优化 得到 
同理 
其中。 
import cv2
import matplotlib.pylab as plt
import numpy as np
import mathdef calcGrayHist(image):rows, cols  image.shape[:2]grayHist  np.zeros([256], np.uint64)for row in range(rows):for col in range(cols):grayHist[image[row][col]]  1return grayHistdef thresh_entropy(image):rows, cols  image.shape# 求灰度直方图grayHist  calcGrayHist(image)# 归一化灰度直方图即概率直方图normGrayHist  grayHist / float(rows*cols)  # 就是上面讲的p(i)# 1.计算累加直方图zeroCumuMoment  np.zeros([256], np.float32) # 就是上面讲的P(i)for i in range(256):if i  0:zeroCumuMoment[i]  normGrayHist[i]else:zeroCumuMoment[i]  zeroCumuMoment[i-1]  normGrayHist[i]# 2.计算各个灰度级的熵entropy  np.zeros([256], np.float32)  # 就是上面讲的S_0(q)for i in range(256):if i  0:if normGrayHist[i]  0:  # 0log2_0是0但是对数在0处没有定义entropy[i]  0else:entropy[i]  -normGrayHist[i] * math.log2(normGrayHist[i])else:if normGrayHist[i]  0:entropy[i]  entropy[i-1] # 0log2_0是0但是对数在0处没有定义else:entropy[i]  entropy[i-1] - normGrayHist[i] * math.log2(normGrayHist[i])# 3.找阈值fT  np.zeros([256], np.float32)ft1, ft2  0.0, 0.0totalEntropy  entropy[255]for i in range(255):# 找最大值ft1  entropy[i] / zeroCumuMoment[i]  math.log2(zeroCumuMoment[i])ft2  (entropy[255] - entropy[i]) / (1 - zeroCumuMoment[i])  math.log2(1 - zeroCumuMoment[i])fT[i]  ft1  ft2# 找最大值的索引作为得到的阈值print(fT)threshLoc  np.where(fT  np.max(fT))thresh  threshLoc[0][0]# 阈值处理threshold  np.copy(image)threshold[thresholdthresh]  255threshold[thresholdthresh]  0return thresh, thresholddef main():img  cv2.imread(6.jpg, 0)thresh, threshImg  thresh_entropy(img)print(thresh) # 结果是104.0titles  [Original Image, After Binarization]images  [img, threshImg]for i in range(2):plt.subplot(1, 2, i  1)plt.imshow(images[i], gray)plt.title(titles[i])plt.xticks([])plt.yticks([])plt.show()main()