如何使用opencv-python识别图像的形状是对称的还是非对称的?

Car*_*ego 4 python opencv image

我正致力于提取图像特征,我正在尝试识别某个图像是否对称.我正在使用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()
Run Code Online (Sandbox Code Playgroud)

出口: 在此输入图像描述

在这种情况下,我想要分类,如果我正在分析的点是对称的,下面的图像,在视觉上注意到它不是对称的,而上面的图的第一个图像是对称的.

在此输入图像描述

yap*_*s87 6

我假设变量thresh是二进制图像.

为了找到非均匀物体的对称性,我建议我们比较X和Y轴上二进制像素的投影. 在此输入图像描述

然后通过直方图比较方法比较2直方图,如相关性,卡方或Bhattacharyya距离.(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)
Run Code Online (Sandbox Code Playgroud)

其中thresh_square是以二进制blob为中心的平方ROI.您需要为G_X和G_Y设置相同的容器才能进行有意义的比较.

较高的相关值应对应于对称对象,而较低的相关值将对应于不对称的对象.

将此代码运行到一些对称和非对称示例中,并检查compare_val值.您应该能够找到将两者分开的阈值.


Set*_*hle 3

以下是我解决这个问题的方法:

  1. 测量每个半径距中心的距离
  2. 将测量结果分为两组(0 到 180、180 到 360)
  3. 获取两组的平均值并进行比较,看看它们在误差范围内是否相等。
  4. 将组的分割旋转 1 度,然后重试,直到达到 179 度
  5. 检查返回的任何分割在边距内是否相等。

您可能需要调整等边距一段时间才能找到可接受的准确范围。

另外,您可能必须对旋转进行仲裁检查,以查看 x 旋转在边距内是否相等,那么它是对称的。

您可能还需要将其分成象限,而不是一半待定要检查对称性的轴数。