Как замаскировать круглую область?
Я пытаюсь замаскировать круглую область на изображении. Я поместил код и выходное изображение ниже. Как вы можете видеть, я рисую круг вокруг радужной оболочки. После этого я хочу затемнить все, что находится за пределами круглой области. Как мне нужно продолжить? Есть ли другие способы сделать это?
Спасибо...
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('i1.jpg',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,120,
param1=50,param2=50,minRadius=30,maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv2.imwrite("iris.jpg",cimg)
plt.imshow(cimg, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()
1 ответ
Прежде всего, HoughCircles
Функция возвращает серию кружков, которые находятся на изображении. В вашем случае ваше изображение имеет только один кружок, поэтому ваш код показывает только один кружок вокруг радужной оболочки. Вы должны решить, какой круг соответствует радужной оболочке в первую очередь.
Давайте предположим, что на вашем изображении есть только один круг - ирис. Вы можете пройтись по всем пикселям в вашем изображении и проверить, находятся ли они близко к центру круга. Если это не так, вы можете изменить значение пикселя на 0, что соответствует черному.
import cv2
import numpy as np
from matplotlib import pyplot as plt
from math import hypot
img = cv2.imread('asd.png',0)
img = cv2.medianBlur(img,5)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,120,param1=50,param2=50,minRadius=30,maxRadius=0)
circles = np.uint16(np.around(circles))
x, y, r = circles[0,:][0]
rows, cols = img.shape
for i in range(cols):
for j in range(rows):
if hypot(i-x, j-y) > r:
img[j,i] = 0
cv2.imwrite("iris.jpg",img)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])
plt.show()