2017-01-16 2 views
1
img = cv2.imread('/home/user/Documents/workspace/ImageProcessing/img.JPG'); 
image = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 

#red, blue, yellow, and gray 
boundaries = [ 
([17, 15, 100], [50, 56, 200]), 
([86, 31, 4], [220, 88, 50]), 
([25, 146, 190], [62, 174, 250]), 
([103, 86, 65], [145, 133, 128])] 


for i, (lower, upper) in enumerate(boundaries): 

    lower = np.array(lower, dtype="uint8") 
    upper = np.array(upper, dtype="uint8") 

    mask = cv2.inRange(image, lower, upper) 
    output = cv2.bitwise_and(image, image, mask=mask) 

    cv2.imwrite(str(i) + 'image.jpg', output) 

빨강, 파랑, 노랑 및 회색을 이미지에서 분리하려고합니다 (별도로). "감도"가 낮은 편이지만 지금까지 효과가 있습니다. 알고리즘에 작은 색 반점이 없습니다. 이것을 교정 할 방법이 있습니까? 감사합니다.Python OpenCV - cv.inRange() "sensitivity"?

편집 : 입력 이미지 input

출력
output1 output2 output3 output4

+0

입력/출력 이미지를 추가 할 수 있으면 문제를 더 잘 이해하는 데 도움이됩니다. – ilke444

답변

3

inRange 기능이 내장 된 감도를 가지고 있지 않습니다. 값만 비교합니다. inRange(x,10,20)은 {10,11, ..., 20}만을 제공합니다.

이 문제를 극복하는 한 가지 방법은 나만의 민감도 측정을 도입하는 것입니다.

s = 5 # for example sensitivity=5/256 color values in range [0,255] 

for i, (lower, upper) in enumerate(boundaries): 

    lower = np.array([color-s if color-s>-1 else 0 for color in lower], dtype="uint8") 
    upper = np.array([color+s if color+s<256 else 255 for color in upper], dtype="uint8") 

    mask = cv2.inRange(image, lower, upper) 
    output = cv2.bitwise_and(image, image, mask=mask) 

    cv2.imwrite(str(i) + 'image.jpg', output) 

또는 이미지를 부드럽게 처리하여 노이즈가 많은 픽셀을 제거 할 수 있습니다. 이렇게하면 픽셀 값이 서로 가깝게되어 경계에서 벗어난 값이 범위에 더 가까운 값을 얻을 수 있습니다.

+0

답변 해 주셔서 감사합니다! – cmplx96

+0

하지만 민감도 0.01에서 200 사이의 모든 것을 시도했지만 더 좋은 결과를 얻지 못했습니다. – cmplx96

+0

감도 = 20 이후의 모든 것이 검은 색입니다 – cmplx96