머신러닝/openCV

openCV 기초, join, 사진 합치기 쌓기, 색깔 감지하기, bitwise_and, mask

Olivia-BlackCherry 2025. 2. 20. 16:26

목차

     

    openCV 기초, join, 사진 합치기 쌓기, 색깔 감지하기, bitwise_and, mask

     

    1. 가로 및 세로로 쌓기

    import cv2
    import numpy as np
    image = cv2.imread("../Resources/Images/image2.jpg")
    
    #We will stack the images with itself, first i will use the horizontal stack function
    imageHor = np.hstack((image, image, image, image))
    imageVert = np.vstack((image, image, image))
    
    cv2.imshow("Horizontal Stack", imageHor)
    cv2.imshow("Vertical Stack", imageVert)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

     

    2. 사이즈 중요

    import cv2
    import numpy as np
    image = cv2.imread("../Resources/Images/image2.jpg")
    imageGray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    print(image.shape, imageGray.shape)
    
    #We will stack the images with itself, first i will use the horizontal stack function
    imageHor = np.hstack((image, image, image, imageGray))
    imageVert = np.vstack((image, image, imageGray))
    
    cv2.imshow("Horizontal Stack", imageHor)
    cv2.imshow("Vertical Stack", imageVert)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    (159, 318, 3) (159, 318)

    사이즈가 다른 경우에는 가능하지 않음. 

     

     

    3. HSV

    색을 표현하는 방식 중 하나로 인간의 시각적 인식 방식과 유사하게 색을 표현한다.

    Hue 색상, Saturation 채도, Value 명도의 세 가지 요소로 구성된 색 공간이다. 

    특정 색을 쉽게 필터링하기 좋아 색 추출에 자주 쓰인다.  0~ 179까지 범위

    채도는 색의 선명도를 이야기한다. 0이면 회색 255면 원색

    명도는 밝기를 이야기한다. 0이면 검정 255면 완전 밝음

    import cv2
    import numpy as np
    #Read an Image
    image = cv2.imread("../Resources/Images/carImage.png")
    
    #Convert the image from BGR to HSV color Space
    imageHSV = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
    #Display the Image
    cv2.imshow("Image", image)
    cv2.imshow("ImageHSV", imageHSV)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

     

    4. 트랙바 만들기

    namedWindow : 윈도우 생성

    resizeWindow : 윈도우 사이즈 조정

    createTrackbar : 트랙바의 이름, 윈도우창, 초기값, 최대값, 트랙바 값이 변경될 때 실행할 콜백 함수

    import cv2
    
    def empty(a):
        pass
    
    #trackbars라는 이름을 가진 window 생성 및 사이즈 조정
    cv2.namedWindow("Trackbars")
    cv2.resizeWindow("Trackbars", 640, 240)
    cv2.createTrackbar("Hue Min", "Trackbars", 0,179, empty)
    cv2.createTrackbar("Hue Max", "Trackbars", 179, 179, empty)
    cv2.createTrackbar("Sat Min", "Trackbars", 0, 255, empty)
    cv2.createTrackbar("Sat Max", "Trackbars", 255, 255, empty)
    cv2.createTrackbar("Value Min", "Trackbars", 0, 255, empty)
    cv2.createTrackbar("Value Max", "Trackbars", 255, 255, empty)
    
    while True:
        # Read an Image
        image = cv2.imread("../Resources/Images/carImage.png")
        # Convert the image from BGR to HSV color Space
        imageHSV = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        #Read the Trackbar values so we can apply on our image
        h_min = cv2.getTrackbarPos("Hue Min", "Trackbars")
        h_max = cv2.getTrackbarPos("Hue Max", "Trackbars")
        s_min = cv2.getTrackbarPos("Sat Min", "Trackbars")
        s_max = cv2.getTrackbarPos("Sat Max", "Trackbars")
        v_min = cv2.getTrackbarPos("Value Min", "Trackbars")
        v_max = cv2.getTrackbarPos("Value Max", "Trackbars")
        print(h_min, h_max, s_min, s_max, v_min, v_max)
        # Display the Image
        cv2.imshow("Image", image)
        cv2.imshow("ImageHSV", imageHSV)
        if cv2.waitKey(100) & 0xFF == ord('1'):
            break
        # cv2.destroyAllWindows()

     # Display the Image
        lower = np.array([h_min, s_min, v_min])
        upper = np.array([h_max, s_max, v_max])
        #Create a Mask 이미지의 특정 색상의 범위를 설정하고, 해당 범위 내의 색상을 마스크로 생성
        #범위 안의 색상은 흰색, 나머지는 검정색으로 변환
        mask = cv2.inRange(imageHSV, lower, upper)

     

     

    5. 마스크 만들기(트랙바로 직접 조절)

    import cv2
    import numpy as np
    
    def empty(a):
        pass
    
    #trackbars라는 이름을 가진 window 생성 및 사이즈 조정
    cv2.namedWindow("Trackbars")
    cv2.resizeWindow("Trackbars", 640, 240)
    cv2.createTrackbar("Hue Min", "Trackbars", 0,179, empty)
    cv2.createTrackbar("Hue Max", "Trackbars", 179, 179, empty)
    cv2.createTrackbar("Sat Min", "Trackbars", 0, 255, empty)
    cv2.createTrackbar("Sat Max", "Trackbars", 255, 255, empty)
    cv2.createTrackbar("Value Min", "Trackbars", 0, 255, empty)
    cv2.createTrackbar("Value Max", "Trackbars", 255, 255, empty)
    
    while True:
        # Read an Image
        image = cv2.imread("../Resources/Images/carImage.png")
        # Convert the image from BGR to HSV color Space
        imageHSV = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        #Read the Trackbar values so we can apply on our image
        h_min = cv2.getTrackbarPos("Hue Min", "Trackbars")
        h_max = cv2.getTrackbarPos("Hue Max", "Trackbars")
        s_min = cv2.getTrackbarPos("Sat Min", "Trackbars")
        s_max = cv2.getTrackbarPos("Sat Max", "Trackbars")
        v_min = cv2.getTrackbarPos("Value Min", "Trackbars")
        v_max = cv2.getTrackbarPos("Value Max", "Trackbars")
        print(h_min, h_max, s_min, s_max, v_min, v_max)
        lower = np.array([h_min, s_min, v_min])
        upper = np.array([h_max, s_max, v_max])
        #Create a Mask
        #이미지의 특정 색상의 범위를 설정하고, 해당 범위 내의 색상을 마스크로 생성
        #범위 안의 색상은 흰색, 나머지는 검정색으로 변환
        mask = cv2.inRange(imageHSV, lower, upper)
        #비트 단위(bitwise) AND 연산을 수행하여 두 이미지 또는 배열을 결합하는 역할
    	#두 이미지에서 같은 부분만 남고, 다른 부분은 사라짐
        imgResult = cv2.bitwise_and(image, image, mask=mask)
    
        # Display the Image
        cv2.imshow("Mask Image", mask)
        cv2.imshow("Output Image", imgResult)
        if cv2.waitKey(1) & 0xFF == ord('1'):
            break
        # cv2.destroyAllWindows()

     

     

     

    6. 마스크로 조절(값 지정)

    import cv2
    import numpy as np
    
    image = cv2.imread("../Resources/Images/carImage.png")
    
    imageHSV = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
    #imageHSV에서 lower~upper 범위에 해당하는 픽셀을 추출하는 마스크 생성
    lower = np.array([0,154,117])
    upper = np.array([179, 255, 255])
    
    #비트 단위(bitwise) AND 연산을 수행하여 두 이미지 또는 배열을 결합하는 역할
    #두 이미지에서 같은 부분만 남고, 다른 부분은 사라짐
    mask = cv2.inRange(imageHSV, lower, upper)
    imageOutput = cv2.bitwise_and(image, image, mask = mask)
    
    cv2.imshow("Mask Image", mask)
    cv2.imshow("Output Image", imageOutput)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

     

    openCV 기초, join, 사진 합치기 쌓기, 색깔 감지하기, bitwise_and, mask