머신러닝/openCV

openCV 기초, 가우시안 블러, BGR, blur, edge, dialation, erosion, resize, crop, draw, input text, color

Olivia-BlackCherry 2025. 2. 19. 15:39

목차

     

    1. 배경처리

    import cv2
    
    #Read an Image using OpenCV
    image = cv2.imread("../Resources/Images/image1.jpg")
    
    #Convert the image to Gray Scale
    imageGray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    #Display the Image
    cv2.imshow("Image",image)
    cv2.imshow("Gray Scale Image", imageGray)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

     

    2. 가우시안 블러

    #Import All the Required Libraries
    #가우시안블러 : 이미지의 세부 사항을 흐리게 하여 부드러운 느낌을 주는 효과
    import cv2
    #Read an Iamge
    image = cv2.imread("../Resources/Images/image1.jpg")
    
    #Blur the input image
    #가우시안 커널의 크기를 지정하는 튜플. 7x7 크기의 필터, 홀수만 가능
    #커널 크기가 커질수록 더 강한 흐림 효과가 적용
    #작은 값은 흐림이 덜 강하고, 큰 값은 더 부드러운 흐림 가짐.
    #sigmaX에서 시그마느느 표준편차를 의미하고, 0은 opencv가 자동으로
    #이미지 크기에 맞춰 적절한 표준편차 값을 계산하는 것을 의미
    imageBlur = cv2.GaussianBlur(image, (55,55), 0)
    
    #Display the Iamge
    cv2.imshow("Image", image)
    cv2.imshow("Blur Image", imageBlur)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

    가우시안블러 함수에서 ( , ) 숫자는 커널을 의미한다.

    홀수만 입력할 수 있으며 커널 크기가 커질 수록 강한 흐림 효과가 적용된다. 

     

     

    3. 경계 추출

    #이미지에서 에지를 검출하는 함수 : Canny()
    #이미지에서 경계선을 검출하는 데 사용
    import cv2
    image = cv2.imread("../Resources/Images/image5.jpg")
    
    #Detect Edges in the Image using Canny Edge Detector
    # (100, 100) => threshold1, thredshold2
    # threshold1: 하한 임계값. 이미지의 픽셀이 이 값을 초과하는 에지로 간주함.
    # threshold2: 상한 임계값. 이미지의 픽셀이 이 값을 초과하면 확실한 에지로 간주.
    
    imageCanny = cv2.Canny(image, 100, 100)
    
    cv2.imshow("Input Image", image)
    cv2.imshow("Edge Detector", imageCanny)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

     

    만약 임계값을 수정한다면?

    값이 커질 수록 경계선이 줄어드는 것을 알 수 있다.

    imageCanny = cv2.Canny(image, 100, 100)
    imageCanny2 = cv2.Canny(image, 150, 200)

     

     

    4. 팽창 dialation

    dilate 함수는 팽창 연산을 적용하는 함수로, 이미지의 밝은 부분(흰색)을 확장시키는 역할을 함.

    # dialation(팽창):이미지에서 밝은 부분(전경)을 확장하여 어두운 부분(배경)을 덮어버리는 효과가 있음
    #Dialation : To increase the thickness of our edges
    #커널이 이미지에 적용되어 커널이 포함된 영역에서 가장 큰 값을 해당 위치에 대입
    #커널의 중심을 기준으로 그 주변의 값 중에 최댓값을 출력해주는 방식
    import cv2
    import numpy as np
    image = cv2.imread("../Resources/Images/image5.jpg")
    
    #Detect Edges
    imageCanny = cv2.Canny(image, 100, 100)
    
    #np.uint8 배열의 원소 타입을 8비트 부호 없는 정수로 지정 (0~255 범위의 값)
    kernel = np.ones((5,5), np.uint8)
    
    # print(kernel)
    
    #Canny 에지 검출 후 작은 선들이 확장되면서 더 두꺼운 경계선으로 보이게 됨
    imageDialation = cv2.dilate(imageCanny, kernel, iterations=1)
    
    cv2.imshow("Canny Edge Detector", imageCanny)
    cv2.imshow("Image Dialation", imageDialation)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

     

    iteration 횟수를 5로 늘리면

     

     

    커널 

    kernel = np.ones((5,5), np.uint8)

     

     

     

    5. 침식 erosion (<-> dialation)

    Erosion은 침식을 뜻하는 의미로 dialation과 반대의 의미이다. 

    이미지의 밝은 영역을 줄이는 효과를 제공하는데, erode 함수는 이미지에서 객체의 경계를 축소시킨다. 즉 아래의 코드에서 경계의 굵기를 줄인다. 밝은 부분은 축소되고, 어두운 부분은 확장되어 이미지 객체가 줄어들고 경계썬이 얕아진다.

    import cv2
    import numpy as np
    image = cv2.imread("../Resources/Images/image5.jpg")
    
    #Detect Edges
    imageCanny = cv2.Canny(image, 100, 100)
    
    #Dialation
    kernel = np.ones((5,5), np.uint8)
    imageDialation = cv2.dilate(imageCanny, kernel, iterations=1)
    
    #Erosion
    imageErosion = cv2.erode(imageDialation, kernel, iterations=1)
    
    cv2.imshow("Image Dialation", imageDialation)
    cv2.imshow("Image Erosion", imageErosion)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

     

    6. 이미지축소 resize

    (578, 872, 3)
    (332, 500, 3)
    (664, 1000, 3)

    3개의 이미지사이즈 변화를 살펴보자.

    import cv2
    import numpy as np
    image = cv2.imread("../Resources/Images/image5.jpg")
    
    imageResize = cv2.resize(image, (500, 332))
    imageIncrease = cv2.resize(image, (1000, 664))
    
    cv2.imshow("Input Image", image)
    cv2.imshow("Image Resize", imageResize)
    cv2.imshow("Image Increase", imageIncrease)
    
    print(image.shape) #(578, 872, 3)
    print(imageResize.shape)
    print(imageIncrease.shape)
    
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

     

    7. 크롭 crop 

    잘라내기를 할 때 이미지 배열을 슬라이싱한다. 왼쪽 상단 모서리가 시작점이다. 

    import cv2
    image = cv2.imread("../Resources/Images/image1.jpg")
    
    print(image.shape) #(578, 872, 3)
    
    #형태로 배열 슬라이싱을 사용하여 이미지의 특정 부분을 잘라냄
    imageCropped = image[0:200, 0:200]
    imageCropped2 = image[100:578, 200:872]
    
    
    # cv2.imshow("Image", image)
    cv2.imshow("Image", image)
    cv2.imshow("Crop Image", imageCropped)
    cv2.imshow("Crop Image2", imageCropped2)
    
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

     

    8. 색깔

     

    <기본 검정 바탕>

    2D 배열을 생성. 즉 흑백이미지. 

    (512,512)의 의미는 세로 512픽셀, 가로 512픽셀로 크기를 설정한 것임. 

    각 픽셀 값은 단일 값 0부터 255 까지로 설정되는데, 기본적으로 이 값은 0으로 초기화되며 이는 검은색을 의미한다.

    여기서 채널은 1개, 따라서 흑백컬러이다.

    import cv2
    import numpy as np
    
    image = np.zeros((512,512))
    
    print(image.shape)
    
    cv2.imshow("Image", image)
    cv2.waitKey(0)

     

     

    <3D 배열>

    컬러 이미지를 생성하기 위해 세 번째 차원이 추가됨. 각 채널은 red, green, blue임 rgb라고 부름.

    import cv2
    import numpy as np
    
    # image = np.zeros((512,512))
    
    #To add color function we will give it 3 channels
    image = np.zeros((512,512,3), np.uint8)
    image[:] = 255, 0, 0
    print(image.shape)
    
    cv2.imshow("Image", image)
    cv2.waitKey(0)

     

    255, 0, 0

     

    0, 255, 0 

    0,0,255

     

     

     

    image[0:256, :] = 15, 200, 255

     

     

     

    9. 라인 그리기

    cv2.line(image, (100,300),(300,300), (0,255,0), 3)

    포인트1, 포인트2, 색깔, 굵기

     

    사각형 그리기

    이미지, 시작점, 종료지점, 색깔, 굵기

    cv2.rectangle(image, (0,0), (200, 100), (0,0,255), -1)

     

     

    draw circle

     

    Text 

    cv2.putText(image, "OpenCV", (200,200), cv2.FONT_HERSHEY_COMPLEX, 2, (233,0,39), 3)

    이미지, 쓸 내용, 시작점, 폰트, 크기, 색깔, 굵기

     

     

    --> 전체코드

    import cv2
    import numpy as np
    
    #To add color function we will give it 3 channels
    image = np.zeros((512,512,3), np.uint8)
    image[0:256, :] = 15, 200, 255
    print(image.shape)
    
    cv2.line(image, (100,300),(300,300), (0,255,0), 3)
    cv2.rectangle(image, (0,0), (200, 100), (0,0,255), -1)
    cv2.circle(image, (250,250), 30, (255,255,0), -1)
    cv2.putText(image, "OpenCV", (200,200), cv2.FONT_HERSHEY_COMPLEX, 2, (233,0,39), 3)
    
    cv2.imshow("Image", image)
    cv2.waitKey(0)

     

     

    openCV 기초, 가우시안 블러, BGR, blur, edge, dialation, erosion, resize, crop, draw, input text, color