问题:请检测出下图中的珍珠。
直方图均衡(equalizeHist)是一种图像处理技术,用于增强图像的对比度。该技术的原理是通过对图像的灰度值进行重新分配,使得灰度值分布更均匀,从而使得图像的对比度得到增强。
直方图均衡的过程如下:
统计图像中每个灰度值出现的次数,得到图像的灰度值分布直方图;
计算出每个灰度级的概率密度函数(PDF);
计算出每个灰度级的累积分布函数(CDF);
根据CDF对每个像素点的灰度值进行重新分配,使得重新分配后的灰度值分布更均匀。
直方图均衡可以使得图像中的细节更加清晰,从而提高图像的质量和信息量。但是,直方图均衡也会导致图像中噪声和背景的增强,从而降低图像的视觉质量。因此,在实际应用中,需要根据具体情况选择合适的图像增强方法。
霍夫变换(Hough Transform)是一种在数字图像处理中,用于检测特定形状的算法。它最初由霍夫(Hough)于1962年提出,用于检测直线。后来,霍夫变换被扩展用于检测各种形状,如圆、椭圆等。
其基本原理是将图像中的像素点在参数空间中进行映射,从而在参数空间中形成一条曲线,当曲线在某些位置交叉时,则说明在原始图像中存在所要检测的特定形状。参数空间可以是直线的极坐标空间,也可以是圆或椭圆的参数空间。
先对原图的灰度图像进行直方图均衡化提升图像对比度,再进行霍夫变换,从而可较好地实现检测图中的珍珠。
import cv2
# 读取图像并转换为灰度图像
img = cv2.imread('2-1.jpg')
h = img.shape[0]
w = img.shape[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对直方图进行均衡化
equ = cv2.equalizeHist(gray)
# 运行HoughLines函数以检测直线
edges = cv2.Canny(equ, 100, 300, apertureSize=3)
cv2.imshow('edges', edges)
# 运行HoughCircles函数以检测圆圈
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, minDist=50, param1=1000, param2=14, minRadius=30, maxRadius=60)
# 绘制检测到的圆圈
sum_circle = 0
for circle in circles[0]:
x, y, r = circle
cv2.circle(img, (x, y), r, (0, 0, 255), 2)
sum_circle += 1
print('图中珍珠的数量为:', sum_circle)
# 显示结果
cv2.imshow('image', img)
cv2.imwrite('result.png', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果图:
可以看到,通过对原图灰度图像进行直方图均衡后再进行霍夫变换,可以检测出图中所有形态完整的珍珠,除了左右边缘的两个被截断的形态不完整的珍珠没有被检测到,总体效果还是不错的。