1

I am trying to mask circular area in image.I put the code and the output image below.As you can see,I draw the circle around iris.After this point,I want to black out everything outside circular area.How do I need to continue?Are there another ways to do so?

Thanks...

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()

enter image description here

Akif Çelebi
  • 41
  • 2
  • 8
  • 1
    create a black image with same size of your original image. draw a filled white circle where you want your mask with `cv2.circle` function. use .setTo or .copyTo functions with inverse mask or mask, if those functions are present in python opencv. – Micka Dec 15 '15 at 16:13

1 Answers1

1

First of all, HoughCircles function returns a series of circles that happens to be on image. In your case, your image has only one cirle, therefore your code shows only one circle around the iris. You have to decide which circle corresponds to the iris in the first place.

Let's assume there is only one circle, which is iris, on your image. You can traverse all the pixels in your image and check if they are close to the center of circle. If it doesn't, you can change pixel value by 0, which corresponds to black.

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()
Ekrem Doğan
  • 674
  • 6
  • 13