문제


I am finding biggest blob in a image using python opencv2. While I give Image1 as input it gives correct output but the same code gives wrong output when I try with another image Image2. The two input images gives different thresholded images as output. I hope problem is here. Actually what mistake I am doing? Thanks in advance.

Input Images Screenshot :-
http://www.4shared.com/download/oV1dy6YKba/image-00001.png
Output Images Screenshot :-
http://www.4shared.com/download/R5fWf_nWba/1_online.png

Red color rectangle marked object is Target. Image1 detected object correctly, but Image2 wrongly detects.

Code:-

import cv2
import numpy as np

def do(im):
    im1 = im
    im = cv2.cvtColor(im,cv2.COLOR_RGB2GRAY)
    cv2.imwrite('01gray.jpg',im)
    ret,thresh = cv2.threshold(im,127,255,0)
    cv2.imwrite('02thresh.jpg',thresh)
    contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(im1,contours,-1,(0,255,0),3) 
    cv2.imshow('test',im1)  
    cv2.imwrite('03test.png',im1)  

    #test
    max_area = 0
    best_cnt = None
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area > max_area:
            max_area = area
            best_cnt = cnt
    #print best_cnt
    # finding centroids of best_cnt and draw a circle there
    M = cv2.moments(best_cnt)
    cx,cy = int(M['m10']/M['m00']), int(M['m01']/M['m00'])    
    print cx,cy    

    if best_cnt is not None:
        x,y,w,h = cv2.boundingRect(best_cnt)
        cv2.rectangle(im1, (x,y),(x+w,y+h), (0,0,255), 3)
        cv2.imwrite('04test1.png',im1)

im = cv2.imread('Image1.jpeg') #Works good
#im = cv2.imread('Image2.png') #Problem with that Image
do(im);
도움이 되었습니까?

해결책

You should not use the same threshold for the two images, because the threshold will give you the output of the blobs (white) in the first image and the background (sky) in the second image (not the airplane).

다른 팁

Yes Mr.Ted W. You are correct.

Now, I am finding threshold value for each input image using otsu method as follows

(automatic_thresh_value_calc, im_bw) = cv2.threshold(input_gray_img, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)  
ret,thresh = cv2.threshold(input_gray_img,automatic_thresh_value_calc,255,0)
cv2.imwrite('thresholdedImage.jpg',input_gray_img)

Am I correct ? Else, Is there are good way to find automatic threshold value in python ?

Thanks...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top