OpenCV (4)

Myeongsu Moon·2024년 12월 3일

제로베이스

목록 보기
31/95
post-thumbnail

Chapter5 이미지 연산 심화

이미지 마스킹

  • Bitwise 연산: 같은 픽셀에 있는 것들끼리 연산 해 주는 것

  • Bitwise - and 연산

# 검은색 배경에 흰색 사각형과 원 생성
rectangle = np.zeros((300, 300), dtype="uint8")
cv2.rectangle(rectangle, (50, 50), (250, 250), 255, -1)
circle = np.zeros((300, 300), dtype="uint8")
cv2.circle(circle, (150, 150), 120, 255, -1)

# 비트와이즈 AND 연산 - 두 이미지의 교집합 부분을 표시
bitwiseAnd = cv2.bitwise_and(rectangle, circle)

# 결과 표시
cv2.imshow("Rectangle", rectangle)
cv2.imshow("Circle", circle)
cv2.imshow("AND", bitwiseAnd)

cv2.waitKey(0)
cv2.destroyAllWindows()

  • Bitwise - or, xor, not 연산
# 비트와이즈 OR 연산 - 두 이미지의 합집합 부분을 표시
bitwiseOr = cv2.bitwise_or(rectangle, circle)

# 비트와이즈 XOR 연산 - 두 이미지의 합집합에서 교집합을 뺀 부분을 표시
bitwiseXor = cv2.bitwise_xor(rectangle, circle)

# 비트와이즈 NOT 연산 - 이미지의 색상을 반전
bitwiseNot = cv2.bitwise_not(circle)

  • 컬러 이미지 Bitwise 연산
src = cv2.imread('example_512.png')

# 원형 마스크 생성
mask = np.zeros(src.shape[:2], dtype="uint8")
cv2.circle(mask, (300, 200), 120, (255, 255, 255), -1)

# 원형 마스크 적용 (원형 부분만 보임)
masked_img = cv2.bitwise_and(src, src, mask=mask)

# 마스크 반전 (나머지 부분만 보임)
mask_inv = cv2.bitwise_not(mask)
masked_img_inv = cv2.bitwise_and(src, src, mask=mask_inv)

# 결과 표시
cv2.imshow("Original Image", src)
cv2.imshow("Masked Image (Circle Only)", masked_img)
cv2.imshow("Inverted Masked Image (Rest Only)", masked_img_inv)

cv2.waitKey(0)
cv2.destroyAllWindows()

이미지 마스킹 응용

  • 색상 검출
img = cv2.imread('example_512.png')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

cv2.namedWindow('image')

cv2.createTrackbar('Hue Min', 'image', 0, 179, nothing)
cv2.createTrackbar('Hue Max', 'image', 0, 179, nothing)
cv2.createTrackbar('Sat Min', 'image', 0, 255, nothing)
cv2.createTrackbar('Sat Max', 'image', 255, 255, nothing)
cv2.createTrackbar('Val Min', 'image', 0, 255, nothing)
cv2.createTrackbar('Val Max', 'image', 255, 255, nothing)

while True:
    h_min = cv2.getTrackbarPos('Hue Min', 'image')
    h_max = cv2.getTrackbarPos('Hue Max', 'image')
    s_min = cv2.getTrackbarPos('Sat Min', 'image')
    s_max = cv2.getTrackbarPos('Sat Max', 'image')
    v_min = cv2.getTrackbarPos('Val Min', 'image')
    v_max = cv2.getTrackbarPos('Val Max', 'image')

    # HSV 색상 범위 설정
    lower_color = np.array([h_min, s_min, v_min])
    upper_color = np.array([h_max, s_max, v_max])

    mask = cv2.inRange(hsv, lower_color, upper_color)
    result = cv2.bitwise_and(img, img, mask=mask)

    cv2.imshow('mask', mask)
    cv2.imshow('result', result)

    key = cv2.waitKey(1)
    if key == 27:  # ESC 키를 누르면 종료
        break

cv2.destroyAllWindows()

  • HSV 색상 검출: Hue를 두개 구간으로 나누어서 연산
cv2.createTrackbar('Low Hue Min', 'image', 0, 179, nothing)
cv2.createTrackbar('Low Hue Max', 'image', 179, 179, nothing)
cv2.createTrackbar('High Hue Min', 'image', 160, 179, nothing)
cv2.createTrackbar('High Hue Max', 'image', 179, 179, nothing)
cv2.createTrackbar('Sat Min', 'image', 100, 255, nothing)
cv2.createTrackbar('Sat Max', 'image', 255, 255, nothing)
cv2.createTrackbar('Val Min', 'image', 100, 255, nothing)
cv2.createTrackbar('Val Max', 'image', 255, 255, nothing)

while True:
    low_h_min = cv2.getTrackbarPos('Low Hue Min', 'image')
    low_h_max = cv2.getTrackbarPos('Low Hue Max', 'image')
    high_h_min = cv2.getTrackbarPos('High Hue Min', 'image')
    high_h_max = cv2.getTrackbarPos('High Hue Max', 'image')
    s_min = cv2.getTrackbarPos('Sat Min', 'image')
    s_max = cv2.getTrackbarPos('Sat Max', 'image')
    v_min = cv2.getTrackbarPos('Val Min', 'image')
    v_max = cv2.getTrackbarPos('Val Max', 'image')

    lower_red1 = np.array([low_h_min, s_min, v_min])
    upper_red1 = np.array([low_h_max, s_max, v_max])
    lower_red2 = np.array([high_h_min, s_min, v_min])
    upper_red2 = np.array([high_h_max, s_max, v_max])

    mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
    mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
    mask = cv2.bitwise_or(mask1, mask2)
    result = cv2.bitwise_and(img, img, mask=mask)

    cv2.imshow('mask', mask)
    cv2.imshow('result', result)

    key = cv2.waitKey(1)
    if key == 27:  # ESC 키를 누르면 종료
        break

cv2.destroyAllWindows()

  • 두 장의 이미지 합성

img1 = cv2.imread('princess_512.png')
img2 = cv2.imread('warrior_512.png')

# 알파값 설정 (0.0에서 1.0 사이, 합쳐서 1이 되도록 구성하는 것이 좋음)
alpha = 0.4  # 첫 번째 이미지에 적용될 알파값
beta = 1.0 - alpha  # 두 번째 이미지에 적용될 알파값

# 가중치 합성
result = cv2.addWeighted(img1, alpha, img2, beta, 0)

이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다

0개의 댓글