Как определить, являются ли формы изображения симметричными или асимметричными, используя opencv - python? - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю над извлечением характеристик изображения, в котором я пытаюсь определить, является ли определенное изображение симметричным или нет. Я использую 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

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Я предполагаю, что переменная thresh является двоичным изображением.

Чтобы найти симметрию для неоднородного объекта, я предлагаю сравнить проекцию двоичных пикселей на оси X и Y.enter image description here

Затем сравните 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, чтобы провести значимое сравнение.

Более высокое значение корреляции должно соответствовать симметричному объекту, в то время как более низкое значение корреляции будет соответствовать асимметричному объекту.

Запустите этот код для нескольких симметричных и асимметричных примеров и проверьте значение compare_val.чтобы найти порог для разделения двух.

0 голосов
/ 21 ноября 2018

Вот как бы я решил эту проблему:

  1. Измерьте расстояние от центра для каждого радиуса
  2. Разделите измерения на две группы (от 0 до 180, от 180 до360)
  3. Получите среднее значение для двух групп и сравните, чтобы увидеть, равны ли они в пределах погрешности.
  4. Поверните разделение групп на 1 градус и повторите попытку, пока не получитедо 179 градусов
  5. проверьте, равно ли любое возвращенное разбиение в пределах поля.

Возможно, вам придется некоторое время изменить границу равенства, чтобы найти диапазон, который является приемлемо точным.

Кроме того, вам может потребоваться кворум для проверки вращений, чтобы увидеть, являются ли вращения xравно в пределах поля, то оно симметрично.

вам также может понадобиться разделить его на квадранты, а не на половину ожидаемого количества осей, для которых вы хотите проверить симметрию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...