λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

AI/Computer Vision

[Computer Vision] 컬러 μ˜μƒ 처리

728x90
λ°˜μ‘ν˜•
πŸ‘€ λ³Έ μ˜ˆμ œλŠ” Window10의 VSCode, Python3.11.0둜 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

컬러 μ˜μƒμ€ 기본적으둜 RGB 즉, 빨간색(Red), 녹색(Green), νŒŒλž€μƒ‰(Blue) 색상 μ„±λΆ„μ˜ μ‘°ν•©μœΌλ‘œ ν”½μ…€ 값을 ν‘œν˜„ ν•œλ‹€.

 

κ·ΈλŸ¬λ‚˜ OpenCVμ—μ„œλŠ” RGB λŒ€μ‹  BGR 색상 μˆœμ„œλ‘œ ν”½μ…€ 값을 ν‘œν˜„ν•œλ‹€.

 

각 색상 성뢄은 0 ~ 255 μ‚¬μ΄μ˜ 값을 κ°€μ§ˆ 수 μžˆλ‹€. 

 

OpenCV둜 μ˜μƒμ„ 읽으면 Numpy λ°°μ—΄λ‘œ 읽어지기 λ•Œλ¬Έμ—, 각 ν”½μ…€μ˜ 값을 μ°Έμ‘°ν•  수 μžˆλ‹€.

이λ₯Ό 톡해 μ˜μƒμ˜ 색상을 λ³€κ²½ν•  μˆ˜λ„ μžˆλ‹€.

import cv2

if __name__ == "__main__":
    img = cv2.imread("test.png",cv2.IMREAD_COLOR)
    img = cv2.resize(img,(512,600),interpolation=cv2.INTER_LANCZOS4)
    cv2.imshow("Origin",img)

    cv2.imshow("Reversed",~img) # λ°˜μ „
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

 

색상 κ³΅κ°„μ—λŠ” RGBλ₯Ό μ œμ™Έν•˜λ”λΌλ„ μ—¬λŸ¬κ°€μ§€ 색상 곡간이 μžˆλ‹€.

 

OpenCV: Color Space Conversions

enum  cv::ColorConversionCodes {   cv::COLOR_BGR2BGRA = 0 ,   cv::COLOR_RGB2RGBA = COLOR_BGR2BGRA ,   cv::COLOR_BGRA2BGR = 1 ,   cv::COLOR_RGBA2RGB = COLOR_BGRA2BGR ,   cv::COLOR_BGR2RGBA = 2 ,   cv::COLOR_RGB2BGRA = COLOR_BGR2RGBA ,   cv::C

docs.opencv.org

 

OpenCVλŠ” cvtColor ν•¨μˆ˜λ₯Ό 톡해 색상 곡간을 λ³€κ²½ν•  수 μžˆλ‹€.

import cv2

if __name__ == "__main__":
    img = cv2.imread("test.png",cv2.IMREAD_COLOR)
    img = cv2.resize(img,(512,600),interpolation=cv2.INTER_LANCZOS4)
    cv2.imshow("Origin",img)

    cv2.imshow("RGB",cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
    cv2.imshow("Gray",cv2.cvtColor(img,cv2.COLOR_BGR2GRAY))
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

각 채널을 λΆ„λ¦¬ν•˜λŠ” 방법이 μžˆλ‹€,.

Split ν•¨μˆ˜λ₯Ό μ“°λ©΄ 각 μ±„λ„μ˜ Numpy 배열을 얻을 수 μžˆλ‹€.

import cv2

if __name__ == "__main__":
    img = cv2.imread("test.png",cv2.IMREAD_COLOR)
    img = cv2.resize(img,(512,600),interpolation=cv2.INTER_LANCZOS4)
    cv2.imshow("Origin",img)
    b,g,r = cv2.split(img)
    cv2.imshow("Blue",b)
    cv2.imshow("Green",g)
    cv2.imshow("Red",r)
    me = cv2.merge([b,g,r])
    cv2.imshow("Merged",me)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

 

νžˆμŠ€ν† κ·Έλž¨ ν‰ν™œν™”λ₯Ό 톡해 μ˜μƒμ˜ 원본 색감을 μœ μ§€ν•˜λ©΄μ„œ λͺ…μ•”λΉ„λ₯Ό λ†’νž 수 μžˆλ‹€.

import cv2

if __name__ == "__main__":
    img = cv2.imread("test.png",cv2.IMREAD_COLOR)
    img = cv2.resize(img,(512,600),interpolation=cv2.INTER_LANCZOS4)
    cv2.imshow("Origin",img)

    b,g,r = cv2.split(img)
    b_h = cv2.equalizeHist(b)
    g_h = cv2.equalizeHist(g)
    r_h = cv2.equalizeHist(r)

    eh_img = cv2.merge([b_h,g_h,r_h])

    cv2.imshow("Histogram Equalized Image",eh_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

 

색상 λ²”μœ„ 지정에 μ˜ν•œ μ˜μ—­ 뢄할도 ν•  수 μžˆλ‹€.

inRangeλ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμ • 색상 μ˜μ—­μ„ μΆ”μΆœν•  수 μžˆλ‹€.

import cv2
import numpy as np

if __name__ == "__main__":
    img = cv2.imread("test.png",cv2.IMREAD_COLOR)
    img = cv2.resize(img,(512,600),interpolation=cv2.INTER_LANCZOS4)
    img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    cv2.imshow("Origin",img)

    # 빨간색 λ²”μœ„ μ„€μ • (HSV)
    lower_red = np.array([0, 100, 100])  # ν•˜ν•œκ°’
    upper_red = np.array([10, 255, 255])  # μƒν•œκ°’

    mask = cv2.inRange(img_hsv, lower_red, upper_red)

    cv2.imshow("Red Masking",cv2.bitwise_and(img,img,mask=mask))

    cv2.waitKey(0)
    cv2.destroyAllWindows()

728x90
λ°˜μ‘ν˜•