2015-05-19 14 views
13

का उपयोग करके लाल रंग ढूंढना मैं एक छवि से लाल रंग निकालने की कोशिश कर रहा हूं। मैं सीमा लागू होने वाला निर्दिष्ट सीमा से केवल मूल्यों को छोड़ने के लिए कोड है:,पायथन और ओपनसीवी

img=cv2.imread('img.bmp') 
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
lower_red = np.array([0,50,50]) #example value 
upper_red = np.array([10,255,255]) #example value 
mask = cv2.inRange(img_hsv, lower_red, upper_red) 
img_result = cv2.bitwise_and(img, img, mask=mask) 

लेकिन जैसा कि मैंने जाँच की, लाल रेंज में ह्यू मूल्य हो सकता है, के 0 से 10 तक कहना है, साथ ही श्रृंखला में 170 से करने के लिए के रूप में करते हैं 180. इसलिए, मैं उन दो श्रेणियों में से किसी से मूल्य छोड़ना चाहता हूं। मैंने थ्रेसहोल्ड को 10 से 170 तक सेट करने और cv2.bitwise_not फ़ंक्शन का उपयोग करने की कोशिश की, लेकिन फिर मुझे सभी सफेद रंग भी मिलते हैं। मुझे लगता है कि सबसे अच्छा विकल्प प्रत्येक श्रेणी के लिए एक मुखौटा बनाना होगा और दोनों का उपयोग करना होगा, इसलिए आगे बढ़ने से पहले मुझे किसी भी तरह से उनसे जुड़ना होगा।

क्या कोई तरीका है कि मैं ओपनसीवी का उपयोग करके दो मास्क में शामिल हो सकता हूं? या क्या कोई और तरीका है कि मैं अपना लक्ष्य प्राप्त कर सकता हूं?

संपादित करें। मैं बहुत सुंदर नहीं के साथ आया था, लेकिन काम कर समाधान:

image_result = np.zeros((image_height,image_width,3),np.uint8) 

for i in range(image_height): #those are set elsewhere 
    for j in range(image_width): #those are set elsewhere 
     if img_hsv[i][j][1]>=50 \ 
      and img_hsv[i][j][2]>=50 \ 
      and (img_hsv[i][j][0] <= 10 or img_hsv[i][j][0]>=170): 
      image_result[i][j]=img_hsv[i][j] 

यह बहुत ज्यादा संतुष्ट करता है मेरी जरूरतों, और OpenCV के कार्यों शायद काफी भी ऐसा ही है, लेकिन वहाँ है कि ऐसा करने के लिए एक बेहतर तरीका है (कुछ समर्पित समारोह का उपयोग कर और कम कोड लिखना) कृपया इसे मेरे साथ साझा करें। :)

उत्तर

15

मैं सिर्फ मास्क को एक साथ जोड़ूंगा, और मूल छवि को मुखौटा करने के लिए np.where का उपयोग करूंगा।

img=cv2.imread("img.bmp") 
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 

# lower mask (0-10) 
lower_red = np.array([0,50,50]) 
upper_red = np.array([10,255,255]) 
mask0 = cv2.inRange(img_hsv, lower_red, upper_red) 

# upper mask (170-180) 
lower_red = np.array([170,50,50]) 
upper_red = np.array([180,255,255]) 
mask1 = cv2.inRange(img_hsv, lower_red, upper_red) 

# join my masks 
mask = mask0+mask1 

# set my output img to zero everywhere except my mask 
output_img = img.copy() 
output_img[np.where(mask==0)] = 0 

# or your HSV image, which I *believe* is what you want 
output_hsv = img_hsv.copy() 
output_hsv[np.where(mask==0)] = 0 

यह बहुत तेजी से और बहुत अपनी छवि के प्रत्येक पिक्सेल के माध्यम से पाशन की तुलना में अधिक पठनीय होना चाहिए।

+3

यदि कोई दिलचस्पी लेता है। मैं एम्बेडेड डिवाइसों के साथ काम कर रहा हूं, जैसे रास्पबेरी पीआई। अगली ऑपरेशन आईडी इस तरह के उपकरणों के लिए बहुत भारी है: output_img [np.where (मास्क == 0)] = 0. इसे बहुत तेज से बदला जा सकता है: output_img = cv2.bitwise_and (output_img, output_img, mask = मुखौटा) –

संबंधित मुद्दे