Дубликаты в findcontour opencv

Я новичок в OpenCV и Python. Мне удалось найтиContours и нарисовать boundingRect на контурах и сохранить их как новое изображение. Я столкнулся с проблемой, похоже, программа сохраняет 2 изображения, потому что в найденных контурах есть дубликат. Я застрял в этой части, как мне избежать дублирования?

Вот код:

img = cv2.imread('2.bmp')
img_2 = cv2.imread('2.bmp')
input_img = cv2.addWeighted(img, 0.55, img_2, 0.6, 0)
retval, threshold = cv2.threshold(input_img, 158, 255, cv2.THRESH_BINARY)
threshold = cv2.cvtColor(threshold, cv2.COLOR_BGR2GRAY)
retval2, threshold2 = cv2.threshold(threshold, 0, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)
blur2 = cv2.medianBlur(threshold2,5)
canny = cv2.Canny(blur2, 100,200)
im2, contours, hierarchy = cv2.findContours(canny,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
maxsize = 0  
best = 0  
count = 0
limit_area = 1000
number_name = 0
x = 0
y = 0
w = 0
h = 0
nuclei = []
for cnt in contours:  
    if cv2.contourArea(cnt) >= limit_area:
        print(cv2.contourArea(cnt))
        nuclei.append(cnt)
        print(count)
        x, y, w, h = cv2.boundingRect(cnt)
        roi = blur2[y:y+h, x:x+w]
        outfile = '%d.jpg' % number_name
        cv2.imwrite(outfile, roi)
        number_name += 1
        cnt+=1

    count += 1

cv2.drawContours(blur2, nuclei, -1, (0,0,255), 2)
cv2.rectangle(blur2, (x, y), (x+w, y+h), (0,255,0), 7)

Вот изображение, с которым я пробовал эту программу:

2.bmp

Что вы действительно хотите сделать: найти все контуры, площади которых больше, чем TH, или просто найти контур максимальной площади?

Kinght 金 31.10.2018 13:28

Причина, по которой я поставил limit_area, состоит в том, чтобы найти другие ядра, а не только самое большое

brapbboom 31.10.2018 13:45
0
2
967
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, это изменение должно сделать это за вас.

im2, contours, hierarchy = cv2.findContours(canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

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

img = cv2.imread('nuclei.png',cv2.IMREAD_GRAYSCALE)
retval, threshold = cv2.threshold(255-img, 100,255, cv2.THRESH_BINARY)

Другие вопросы по теме