2015-05-19 52 views
13

Bir görüntüden kırmızı renk çıkarmaya çalışıyorum. Ben belirtilen aralık sadece değerleri terk etmek eşiği geçerlidir kodu vardır: i kontrol eder etmez AmaPython & OpenCV kullanarak kırmızı renk bulma

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) 

, aralıkta Ton değere sahip en 0'dan 10'a kadar say, hem aralığında 170 olarak sağlayabilirsiniz kırmızı 180. Bu nedenle, bu iki aralığın herhangi birinden değerler bırakmak istiyorum. Eşiği 10'dan 170'e ve cv2.bitwise_not işlevini kullanarak ayarlamayı denedim, ancak tüm beyaz rengi de aldım. Sanırım en iyi seçenek, her bir aralık için bir maske oluşturmak ve her ikisini de kullanmaktır, bu yüzden bir şekilde ilerlemeden önce bir araya gelmek zorundayım.

OpenCV kullanarak iki maskeye katılabilmemin bir yolu var mı? Ya da hedefime ulaşmanın başka bir yolu var mı?

Düzeltme. Ben çok zarif değil, ama geldi çalışma çözeltisi:

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] 

Hemen hemen karşılar benim ihtiyaçları ve OpenCV fonksiyonları muhtemelen hemen hemen aynı, ama bunu yapmak için daha iyi bir yol olmadığını (bazı özel işlevini kullanarak ve daha az kod yazarak) lütfen benimle paylaşın. :)

cevap

15

Sadece maskeleri birlikte eklerim ve orijinal resmi maskelemek için np.where'u kullanırdım.

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 

Bu, görüntünüzün her bir pikseline göre döngüden çok daha hızlı ve çok okunabilir olmalıdır.

+3

İlgilenen biri varsa. Raspberry Pi gibi gömülü cihazlarla çalışıyorum. Sonraki işlem kimliği, bu aygıtlar için çok ağır: output_img [np.where (maske == 0)] = 0. Daha hızlı bir tane ile değiştirilebilir: output_img = cv2.bitwise_and (output_img, output_img, mask = mask) –

İlgili konular