适用范围
双峰直方图的图片。彩色图像直方图的双荷花RGB直方图也有比较明显的双峰0-10和100-200.改成灰度直方图也是这样吗?
灰度直方图
![]() |
---|
代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
#计算灰度直方图
def calcGrayHist(grayimage):
#灰度图像矩阵的高,宽
rows, cols = grayimage.shape
print(grayimage.shape)
#存储灰度直方图
grayHist = np.zeros([256],np.uint64)
for r in range(rows):
for c in range(cols):
grayHist[grayimage[r][c]] += 1
plt.plot(grayHist)
plt.show()
return grayHist
#阈值分割:直方图阈值法
def threshTwoPeaks(image):
if len(image.shape) == 2:
gray = image
else:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#计算灰度直方图
histogram = calcGrayHist(gray)
#寻找灰度直方图的最大峰值对应的灰度值
maxLoc = np.where(histogram==np.max(histogram))
firstPeak = maxLoc[0][0]
#寻找灰度直方图的第二个峰值对应的灰度值
measureDists = np.zeros([256],np.float32)
for k in range(256):
measureDists[k] = pow(k-firstPeak,2)*histogram[k]
maxLoc2 = np.where(measureDists==np.max(measureDists))
secondPeak = maxLoc2[0][0]
#找到两个峰值之间的最小值对应的灰度值,作为阈值
thresh = 0
if firstPeak > secondPeak:#第一个峰值再第二个峰值的右侧
temp = histogram[int(secondPeak):int(firstPeak)]
minloc = np.where(temp == np.min(temp))
thresh = secondPeak + minloc[0][0] + 1
else:#第一个峰值再第二个峰值的左侧
temp = histogram[int(firstPeak):int(secondPeak)]
minloc = np.where(temp == np.min(temp))
thresh =firstPeak + minloc[0][0] + 1
#找到阈值之后进行阈值处理,得到二值图
threshImage_out = gray.copy()
#大于阈值的都设置为255
threshImage_out[threshImage_out > thresh] = 255
threshImage_out[threshImage_out <= thresh] = 0
return thresh, threshImage_out
if __name__ == "__main__":
img = cv2.imread('./sucai6/hua.jpg')
#img = cv2.resize(img,(300,400))
thresh,threshImage_out = threshTwoPeaks(img)
print(thresh)
cv2.imshow('src',img)
cv2.imshow('threshImage_out',threshImage_out)
re=cv2.bitwise_and(img,img,mask=threshImage_out)
cv2.imshow('re',re)
cv2.waitKey(0)
cv2.destroyAllWindows()
验证
![]() |
---|
荷花正下方的一块前景是枯败的莲蓬或荷叶,不失为一个亮点。查看原图在以荷花为中心镜像的正上方有支嫩绿的莲蓬,相得益彰真是好看。
总结
一张图的RGB三通道直方图跟转成的灰度图的直方图是相似的。