我正在研究图像特征的提取,其中我试图确定某个图像是否对称。我正在使用opecv-python进行这项工作的开发。
下面的代码用于标识感兴趣区域的中心和直径。您怎么知道该图像是否对称?
import cv2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.offsetbox import AnchoredText
IMG = '015'
thresh = cv2.imread(IMD+'.png',0)
_, contours,hierarchy = cv2.findContours(thresh,2,1)
print (len(contours))
cnt = contours
for i in range (len(cnt)):
(x,y),radius = cv2.minEnclosingCircle(cnt[i])
center = (int(x),int(y))
radius = int(radius)
cv2.circle(thresh,center,radius,(0,255,0),2)
print ('Circle: ' + str(i) + ' - Center: ' + str(center) + ' - Radius: ' + str(radius))
plt.text(x-21, y+15, '+', fontsize=25, color = 'red')
plt.text(10, -10, 'Centro: '+str(center), fontsize=11, color = 'red')
plt.text(340, -10, 'Diametro: '+str((radius*2)/100)+'mm', fontsize=11, color = 'red')
plt.Circle((10, -10), 7.2, color='blue')
plt.imshow(thresh, cmap='gray')
#plt.savefig(IMG+'-diam.png')
plt.show()
在这种情况下,我想对要分析的点是否对称进行分类,以下图像从视觉上注意到它不是对称的,而上图的第一幅图像是对称的。
答案 0 :(得分:5)
我假设变量thresh是二进制图像。
为了找到不均匀物体的对称性,我建议我们比较二进制像素在X和Y轴上的投影。
然后通过直方图比较方法(如相关性,卡方距离或Bhattacharyya距离)比较2个直方图。 (openCV中的示例:https://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.html)
G_X = cv2.reduce(thresh_square, 0 ,cv2.REDUCE_SUM)
G_Y = cv2.reduce(thresh_square, 1 ,cv2.REDUCE_SUM)
compare_val = cv2.compareHist(G_X ,G_Y ,cv2.HISTCMP_CORREL)
其中thresh_square是以二进制二进制点为中心的ROI平方。您需要G_X和G_Y具有相等的bin,才能进行有意义的比较。
较高的相关性值应对应于对称对象,而较低的相关性值应对应于非对称对象。
将此代码运行到一些对称和非对称的示例中,并检查compare_val值。您应该能够找到一个将两者分开的阈值。
答案 1 :(得分:3)
这是我要解决的问题的方法:
您可能需要调整等距以找到可以接受的准确范围。
此外,您可能必须定额检查旋转,以查看x旋转是否在边距内相等,然后对称。
您可能还需要将其划分为多个象限,而不是一半,以等待要检查对称性的轴数。