2016-06-10 6 views
0

Ich habe ein Bild gelesen und ich habe das Bild in HSV-Bild umgewandelt. Ich möchte Schwellenwerte für Farbton-, Sättigungs- und Wertkomponenten getrennt anwenden. Farbton halten 0 bis 1, Sättigung halten 0,28 bis 1 und Wert halten 0 bis 0,55thersholding Grenzen auf HSV-Bild in Python

Ich möchte diese Anwendung für die Farbmaskierung!

wie diese Grenzen auf meine Bilddateien angewendet werden.

image_read = cv2.imread('tryimage.jpg') 
im = cv2.cvtColor(image_read,cv2.COLOR_RGB2HSV) 
im_hue = im[:,:,0] 
im_sat = im[:,:,1] 
im_val = im[:,:,2] 
# how to apply thershold ? 
fig, ax = plt.subplots(nrows=1,ncols=3) 
ax[0].imshow(im_hue) 
ax[1].imshow(im_sat) 
ax[2].imshow(im_val) 
plt.show() 

ich das gleiche in Matlab getan habe, habe ich nur die Pixel meines Interesses in jedem Band aufgenommen und dann verschmolzen diese die Pixel von meinem Interesse zu kommen. Hier ist mein Matlab-Code-Snippet, das ich in Python machen möchte.

color.hueThresholdLow   = 0; 
color.hueThresholdHigh  = 1; 
color.saturationThresholdLow = 0; 
color.saturationThresholdHigh = 0.28; 
color.valueThresholdLow  = 0.38;  
color.valueThresholdHigh  = 0.97; 
maskedRGBImage = color_masking(rgbImage,color); 

function color_masking(rgbImage, color) 
hsvimage = rgb2hsv(rgbImage); 
himage = hsvimage(:,:,1); 
simage = hsvimage(:,:2); 
vimage = hsvimage(:,:,3); 
hMask = (hImage >= color.hueThresholdLow) & (hImage <= color.hueThresholdHigh); 
sMask = (sImage >= color.saturationThresholdLow) & (sImage <= color.saturationThresholdHigh); 
vMask = (vImage >= color.valueThresholdLow) & (vImage <= color.valueThresholdHigh); 

ObjectsMask = uint8(hMask & sMask & vMask); 
..... 
+0

Mit Schwellenwerten meinst du, dass du H, S und V auf diese Werte begrenzen willst, das heißt Werte unter/über den Grenzwerten einhalten oder Werte zurückweisen soll, die nicht in den Grenzwerten liegen? – EvilTak

Antwort

1

In Python können Sie schreiben, es zu Matlab sehr ähnlich. Es ist normalerweise eine gute Idee, eine Funktion für Methoden zu erstellen, die Sie möglicherweise mehrmals verwenden. Sie können die Funktionsdeklaration jedoch nicht entfernen, wenn sie Ihren Anforderungen nicht entspricht.

def threshold_hsv(im_hsv, hlow, hhigh, slow, shigh, vlow, vhigh): 
    im_hue = im_hsv[:,:,0] 
    im_sat = im_hsv[:,:,1] 
    im_val = im_hsv[:,:,2] 

    h_mask = (im_hue >= hlow) & (im_hue <= hhigh) 
    s_mask = (im_sat >= slow) & (im_sat <= shigh) 
    v_mask = (im_val >= vlow) & (im_val <= vhigh) 

    return h_mask & s_mask & v_mask 

Und dann können Sie die Funktion mit Ihren Daten so nennen:

>>> object_mask = threshold_hsv(hsvimage, 0, 1, 0, 0.28, 0.38, 0.97) 

Wie Sie sehen können, ist die Syntax sehr ähnlich (wenn nicht identisch) zu der der Matlab. Dies gilt, solange Ihr hsvimage ein numpy array ist, was OpenCV in Python generiert.

0

Um wählen Werte, die Ihre Grenzen erfüllen (und die, die nicht in den Grenzen verwerfen), verwendet list comprehensions:

# filtered_pixels is a list of tuples, which are ordered as (h, s, v) 
# i.e. filtered_pixels[0][0] = h, filtered_pixels[0][1] = s and 
# filtered_pixels[0][2] = v 
filtered_pixels = [(im_hue[i], im_sat[i], im_val[i]) for i in range(len(im_hue)) if satisfies_limits(im_hue[i], im_sat[i], im_val[i])] 

satisfies_limits eine Funktion, ob die übergebene Farbton, Sättigung überprüft und Wert sind in den erforderlichen Grenzen. Sie können das obige Listenverständnis in eine for Schleife auspacken, wenn Sie möchten.


Um Grenze alle Werte an die gegebenen Grenzen, verwenden Sie die map() builtin:

clamped_hue = map(lambda h: max(hue_min, min(h, hue_max)), im_hue) 
# And so on for saturation and value