Grayscaling Images

김성빈·2024년 4월 14일
0

Modern Computer Vision

목록 보기
5/117

Grayscaling Images?

Grayscaling Images 는 이미지를 흑백처리 한다는 말인데,

위의 사진처럼 흑백으로 처리하는것이다.

그러면 이걸 왜 사용하냐면

  1. 계산량 감소
    RGB는 3차원의 색공간을 가지고 있다.
    즉, R : 0~255, G : 0~255, B : 0~255 를 가지고 있으며 이를 계산하면 255x255x255 = 16581374란 계산을 컴퓨터가 해야하지만 .Grayscale은 1차원인 0~255만 따지게 되므로 연산량이 대폭 감소한다.

  2. 차선의 특별한 색
    차선은 보통 흰색 아니면 노란색으로 구성되어 있다. 이는 Grayscale로 바꿔보면 아래 그래프와 같이 상당히 높은 위치에 차지하여 이진화 하기에 적합하기 때문이다.

아래 사진만 봐도 RGB 사진보다는 흑백사진의 흰, 노란색이 더 잘보이는것을 확인할 수 있다.

[출처] 차선검출에서 Grayscale 하는 이유|작성자 미스타킴

Size

데이터를 처리하기 위해 cv2를 불러오고 pyplot를 plt로 가져왔다.

import cv2
from matplotlib import pyplot as plt

이미지의 가로(w), 세로(h)를 변수에 담아주고
aspect_ratio (가로세로비율)를 구한다.

구하는 이유는 밑에 figure size 작업을 진행을 할때 가로세로비율이 전과 달라지면 사진이 깨지는 현상이 발생한다. 이는 어렸을때 그림판의 크기를 조절할때 그림이 깨지는 현상을 본것과 같다.

#  imshow 함수를 정의합니다
def imshow(title = "Image", image = None, size = 10):
    w, h = image.shape[0], image.shape[1]
    aspect_ratio = w/h
    plt.figure(figsize=(size * aspect_ratio,size))
    plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    plt.title(title)
    plt.show()

# 이미지 다운로드 및 압축 풀기
!gdown --id 1O2uCujErifjvK1ziRGssaQO9khI15g6q
!unzip -qq images.zip

실행을 하면 정상적으로 동작한다.

위의 내용으로 보았을때 size는 사진의 가로세로 비율을 그대로 가져가면서 크기를 줄이는데 사용된다.

현재 원본 이미지를 출력했을때 1000x1300쯤 되는 사진이 출력된다.

# 입력 이미지 로드
image = cv2.imread('./images/castara.jpeg')

imshow("Castara, Tobago", image)

imshow의 image 옆에 size라는 인수를 추가하는데 기본값을 10으로 돼있다.

size = 6을 넣었을때는 위에 사진과 다르게 사진의 크기는 줄었지만 가로세로의 비율은 그대로 유지되는것을 볼수 있다.

Grayscaling

size에 대해서 알아봤고 이제 흑백처리를 할건데 밑에 보면 plt.imshow안에 cvtColor_BRG2RGB가 나와있다.

저번 시간에도 나온 내용이다.
OpenCV는 사진을 저장할때 BRG 순으로 저장하고, matplotlib에서는 사진을 저장할때 RGB로 저장을 한다.

따라서 matplotlib의 라이브러리인 plt를 사용하기 위해선 BRG 형식으로 저장된 사진을 RGB로 변환을 시켜줘야 사용할 수 있게 된다.

image.shape[:2] # (1200, 1920) (height, width)
def imshow(title = "", image = None, size = 10):

    # The line below is changed from w, h to h, w
    h, w = image.shape[0], image.shape[1]
    aspect_ratio = w/h

    plt.figure(figsize=(size * aspect_ratio, size))
    plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    plt.title(title)
    plt.show()

imshow("Castara, Tobago", image)

변환한 내용(이미지)을 흑백처리 해준다.

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

imshow("Converted to Grayscale", gray_image)

흑백처리 왜함


RGB와 달리 흑백은 1차원이다

RGB(100,232,44) 로 처리 할때 흑백은 범위가 0~255인 각각의 하나의 인수만 처리하면된다.

다시 말하면 RGB는 픽셀하나마다 3개의 데이터를 처리하고 흑백은 픽셀하나에 1개의 데이터를 처리하므로

컴퓨터의 입장에서는 흑백의 사진을 처리하는것이 3배 이상 빠르게 일을 처리할수있는것이다.

이 내용을 보이는 무언가로 나타낼땐 저번에 사용했던 Shape를 사용하면된다.

그냥 image(RGB)의 shape를 보면 가로세로 크기와 뒤에 3이 적혀있고, gray_image의 shape를 보면 없는것을 확인할수있다.

profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글