복붙노트

[PYTHON] Python과 OpenCV를 사용하여 붉은 색 찾기

PYTHON

Python과 OpenCV를 사용하여 붉은 색 찾기

이미지에서 붉은 색을 추출하려고합니다. 지정된 범위의 값만 남겨두기 위해 임계 값을 적용하는 코드가 있습니다.

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 함수를 사용하여 시도했지만 그 다음에는 모든 흰색 색상도 얻는다. 가장 좋은 방법은 각 범위의 마스크를 만들고 둘 다 사용하는 것입니다. 그래서 진행하기 전에 어떻게 든 함께 결합해야합니다.

OpenCV를 사용하여 두 개의 마스크를 결합 할 수있는 방법이 있습니까? 아니면 내 목표를 달성 할 수있는 다른 방법이 있습니까?

편집하다. 나는 우아하지는 않지만 작동하는 해결책을 가지고왔다.

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의 기능은 거의 나의 필요를 충족시키고 OpenCV의 기능은 거의 비슷하지만, 더 나은 방법이 있다면 (전용 기능을 사용하고 코드를 적게 쓰면) 나와 공유하십시오. :)

해결법

  1. ==============================

    1.마스크를 함께 추가하고 np.where를 사용하여 원본 이미지를 가릴 수 있습니다.

    마스크를 함께 추가하고 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
    

    이미지의 각 픽셀을 루핑하는 것보다 훨씬 빠르고 읽을 수 있어야합니다.

  2. from https://stackoverflow.com/questions/30331944/finding-red-color-using-python-opencv by cc-by-sa and MIT license