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

标签 python image opencv

我正在研究图像特征的提取,其中我试图识别某个图像是否对称。我正在使用 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()

退出: enter image description here

在这种情况下,我想对我正在分析的点是否对称进行分类,下图从视觉上可以看出它是不对称的,而上图的第一张图像是对称的。

enter image description here

最佳答案

我假设变量 thresh 是一个二值图像。

为了找到非均匀物体的对称性,我建议我们比较二进制像素在 X 轴和 Y 轴上的投影。 enter image description here

然后通过直方图比较方法(例如相关性、卡方或 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 是以二进制 blob 为中心的平方 ROI。您需要为 G_X 和 G_Y 设置相同的 bin 才能进行有意义的比较。

较高的相关值应对应于对称对象,而较低的相关值将对应于非对称对象。

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

关于python - 如何使用 opencv - python 识别图像的形状是对称的还是不对称的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53301086/

相关文章:

c++ - 在 C++ 中支持 cuda 的错误 opencv

Python:找不到并安装 python 模块 'video'

python - 在Python中浏览/解析html页面

image - OpenLayers 中每层多个图像

python - 如何使用python在kafka中创建多个生产者和消费者

android - 如何在打开cv的情况下设置透明背景以抓取输出图像?

python - 随机对角矩阵

python - 是否有 Python 等同于 Java 的 Groovy/Grails

java.lang.IllegalArgumentException : Number of scaling constants does not equal the number of of color or color/alpha components

c++ - 在opencv c++中旋转回图像