Я пытаюсь обнаружить и замаскировать второй по величине контур на изображении, как показано на рисунке 1 (с красным контуром). Однако я не могу определить полный второй по величине контур на изображении. Я получаю то, что показано на рисунке 2. Ниже мой код. Пожалуйста, может кто-нибудь любезно посоветовать.
im = cv2.imread('F:\EA-358-4-1.4\ea-580.png') # Reading image
blur = cv2.GaussianBlur(im,(5,5),cv2.BORDER_DEFAULT) # Smoothing image
img = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY) # Converting to greyscale image
ret, thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
_, contours,_ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # Finding contours, hierarchy et al.
print(len(contours))
# Masking image and drawing contour
cnt = contours
mask = np.zeros_like(im) # Masking the contour
second_largest_cnt = sorted(cnt, key = cv2.contourArea, reverse = True)[1] # Dtermine the second largest contour
cv2.drawContours(mask,[second_largest_cnt],-1,(255,255,255),-1) # Drawing the detected contour
# Copying mask of detected contour unto original image and canning edge detection
out = mask.copy() # Copying the mask nto the original image
out[mask == 255] = im[mask == 255]
canny = feature.canny(out[:, :, 0],sigma=1,low_threshold=5,high_threshold=10) # Detecting the egeds of the image
plt.subplot(121),plt.imshow(canny,cmap='gray')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(out,cmap='gray')
plt.xticks([]),plt.yticks([])
Рисунок 1
Рисунок 2
Рисунок 3
Обновлен код
Я обновил код в соответствии с предложением @HansHirse, но не могу получить никаких результатов.
im = cv2.imread('F:\EA-358-4-1.4\ea-580.png',cv2.IMREAD_GRAYSCALE)
#new = im[:,:,1]
mask = np.zeros_like(im)
th3 = cv2.adaptiveThreshold(im,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,201,-1)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7)),kernel)
dilate = cv2.dilate(mask,cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11)))
img = im-mask
thresh = cv2.threshold(img,0,255,cv2.THRESH_OTSU)
opening = cv2.morphologyEx(img, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7)),kernel)
_, contours,_ = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(im,contours,-1,255,1)
cv2.imshow('im',im)