我在使用python opencv2的图像中找到了最大的blob。当我将Image1作为输入时,它提供了正确的输出,但是当我尝试使用另一个图像Image2时,相同的代码会给出错误的输出。两个输入图像给出不同的阈值图像作为输出。我希望问题在这里。其实我在做什么错?提前致谢。
输入图像截图: -
http://www.4shared.com/download/oV1dy6YKba/image-00001.png
输出图像截图: -
http://www.4shared.com/download/R5fWf_nWba/1_online.png
红色矩形标记的对象是Target。 Image1正确检测到对象,但Image2错误地检测到了。
代码: -
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);
答案 0 :(得分:0)
您不应对两个图像使用相同的阈值,因为阈值将为您提供第一张图像中的斑点(白色)和第二张图像(而不是飞机)中的背景(天空)的输出。 / p>
答案 1 :(得分:0)
是Mr.Ted W.你是对的。
现在,我使用otsu方法找到每个输入图像的阈值,如下左图
(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)
我说错了吗?另外,有没有很好的方法在python中找到自动阈值?
感谢...