OpenCV обнаруживает поля полотенец - PullRequest
0 голосов
/ 27 мая 2018

Каков наилучший метод (с использованием Python и OpenCV) для нахождения нижнего угла (не края) полотенца на этих изображениях?Также цвет полотенца может быть разным, но цвет фона всегда будет одинаковым.

towel

И мне нужен этот угол (самый низкий) реальный"уголок для полотенец": expected result

Ответы [ 3 ]

0 голосов
/ 27 мая 2018

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

Источник1

Источник2

Код:

import cv2
import matplotlib.pyplot as plt

im = cv2.imread('boat.png')
edges = cv2.Canny(im,25,255,L2gradient=False)
plt.imshow(edges,cmap='gray')
plt.show()
0 голосов
/ 27 мая 2018

Поскольку у вас есть приблизительно два разных цвета на изображении (по одному для переднего и заднего плана), вы можете преобразовать свое изображение в цветовое пространство HSV и визуализировать каждый из отдельных каналов.

Код:

path = r'C:\Users\Desktop'
filename = 'towel.jpg'

img = cv2.imread(os.path.join(path, filename))    
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)     #--- convert to HSV
cv2.imshow('hsv.jpg', hsv)
h = hsv[:,:,0]
cv2.imshow('h.jpg', h)                         #--- visualize the hue channel

enter image description here

ret, thresh = cv2.threshold(h, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)
cv2.imshow('thresh1', thresh)                  #--- apply Otsu threshold on hue channel

enter image description here

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

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(25, 25))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
cv2.imshow('fin', cv2.bitwise_not(opening))

enter image description here

РЕДАКТИРОВАНИЕ

OpenCV обеспечивает функциональность для поиска сверху, снизу,крайние правые и крайние левые углы для заданного контура.Я получил контур конечного полученного изображения и нашел четыре крайние точки.

Код:

im2, contours, hierarchy = cv2.findContours(cv2.bitwise_not(opening), cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)                #--- finding contours
cnt = contours[0]                                 #--- since there is only one contour present

leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])

print('The extreme points are leftmost: {}, rightmost: {}, topmost: {} and bottommost: {}'.format(leftmost, rightmost, topmost, bottommost))

The extreme points are leftmost: (32, 336), rightmost: (807, 439), topmost: (459, 12) and bottommost: (699, 743)

Я также отметил крайние точки на копииИсходное изображение:

img2 = img.copy()
cv2.circle(img2, leftmost, 5, (0, 255, 255), -1)    #-- leftmost
cv2.circle(img2, rightmost, 5, (0, 255, 255), -1)    #-- rightmost
cv2.circle(img2, topmost, 5, (0, 255, 255), -1)    #-- topmost
cv2.circle(img2, bottommost, 5, (0, 255, 255), -1)    #-- bottommost

enter image description here

0 голосов
/ 27 мая 2018

вы ищете алгоритм обнаружения края.

Используйте следующий код из Link

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('Your towel image.jpg',0)
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...