Drawing on images

김성빈·2024년 4월 16일
1

Modern Computer Vision

목록 보기
7/117

너비랑 높이의 비율을 계산해서 이미지 비율을 망가뜨리지 않고 비율을 조정할수 있게 하는 imshow라는 함수를 생성

# Our Setup, Import Libaries, Create our Imshow Function and Download our Images
import cv2
import numpy as np
from matplotlib import pyplot as plt

# Define our imshow function 
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()

코드를 설명하자면,
BGR 포맷형태로 이미지를 저장하는 cv2의 이미지를 plt에서 사용하려면
RGB의 이미지 포맷형식으로 변경해주는 cvtColor 함수와 변경할 이미지와 그뒤에 어떻게 변경할건지 에대한 기능을 넣어주면된다.

여태 RGB to BGR, BGR to RGB, BGR to HSV 등 여러가지 기능을 사용해왔고, plt,OpenCV 가 지원하는 이미지 포맷형태에 맞춰서 사용하면된다.

다음은 3차원, RGB 형태의 검은 박스를 생성한다.

검은 빈 박스와 검은 박사를 grayscayling

3차원 형태의 512x512 px의 검은 공간을 생성해주고, 그 검은 공간을 grayscayling 한 흑백 공간을 만들어주자. 흑백은 3개 공간으로 이루이진것이 아닌 하나의 공간, 평면으로 이루어진 (space) 공간이다.

메모리적인 차원으로 보면 image(검은3차원공간)이 image_gray 보다 3배 높은 메모리를 차지한다.

# Create a black image using numpy to create and array of black 
image = np.zeros((512,512,3), np.uint8)

# Can we make this in black and white? grayscale
image_gray = np.zeros((512,512), np.uint8)

# Black would be the same as a greyscale or color image (same for white)
imshow("Black Canvas - RGB Color", image)
imshow("Black Canvas - Grayscale", image_gray)

코드를 실행하면 결과는 둘다 512x512 px의 검은 공간으로 gray scale이 된 공간도 검은색으로 동일하게 나와야한다.


Line

빈 공간을 만들었으니 선을 그려보자.

생성한 이미지(3차원)에 라인을 그리는 기능 - cv2.line
안의 인자는 이미지, 시작점, 끝점, 색상, 두께로 이루어져있고

색상과 두께를 설정해주고 설정된 선으로 시작점과 끝점을 이으는 라인을 생성해주는 기능

cv2.line(image, starting cordinates, ending cordinates, color, thickness)
cv2.line(이미지, (시작점), (끝점),(색상),(두께))
cv2.line(image, (0,0), (511,511), (255,127,0), 5)

imshow("Black Canvas With Diagonal Line", image)

rectangle(직사각형)

3차원의 image에다가 직사각형을 그려볼건데 바로 그리면 전에 그렸던 라인과 함께 직사각형이 같이 나오므로 image를 다시 선언해주고 생성한다.

직사각형 생성 기능은 아래와 같다.
cv2.rectangle(image, starting vertex, opposite vertex, color, thickness)
라인과 똑같이 시작 정점, 종료 정점, 색상, 두께로 직사각형을 그린다.

image라는 검은색 박스를 생성

# Create our black canvas again because now it has a line in it
# image = np.zeros((512,512,3), np.uint8)

# Thickness - if positive. Negative thickness means that it is filled
cv2.rectangle(image, (100,100), (300,250), (127,50,127), 10)
imshow("Black Canvas With Pink Rectangle", image)

이미지를 새로 생성하고 직사각형을 그리면 정상적으로 생성

Circle 원형

cv2.cirlce(image, center, radius, color, fill)
원형은 중점, 반지름, 색상, 채움정도인데

마지막 fill을 -, 음수값으로 두었을때 가득찬 원이 생성된다. 음수만 붙으면 -1, -100, -200 전부 동일하게 가득찬원이 나오게 된다.

image = np.zeros((512,512,3), np.uint8)

cv2.circle(image, (350, 350), 100, (15,150,50), -1) 
imshow("Black Canvas With Green Circle", image)

마지막 fill은 두께로 생각하면 된다. 1로 하면 두께가 1, 200으로 하면 두께가 200
아래는 두께가 76일때 생성한 결과이다.

Polygons 다각형

다각형을 생성하는 기능으로 인자는 아래와 같다.

cv2.polylines(image, points, Closed?, color, thickness)

image = np.zeros((512,512,3), np.uint8)

# Let's define four points
pts = np.array( [[10,50], [400,50], [90,200], [50,500]], np.int32)

# Let's now reshape our points in form  required by polylines
pts = pts.reshape((-1,1,2))

cv2.polylines(image, [pts], True, (0,0,255), 3)
imshow("Black Canvas with Red Polygon", image)

실행 코드를 보면 새로운 이미지를 생성, 다각형을 생성하기 위한 포인트 4개 생성 후 배열에 입력인데

reshape?

오리지널 pts과 reshape를 적용한 pts의 배열을 출력해보면 아래와 같다.

Original pts 배열:
[[ 10  50]
 [400  50]
 [ 90 200]
 [ 50 500]]
Shape: (4, 2)

Reshaped pts 배열:
[[[ 10  50]]

 [[400  50]]

 [[ 90 200]]

 [[ 50 500]]]
Shape: (4, 1, 2)

처음 선언한 pts는 2차원의 배열이고, image는 3차원의 공간이라 서로 맞지 않는다

그래서 2차원의 pts를 3차원에 사용할수있게끔 reshape를 해준것,

즉, reshape된 배열은 OpenCV 함수에 대한 올바른 입력 형태를 갖추기 위한 것, 2차원의 점들을 3차원으로 reshape함으로써 OpenCV가 이해할 수 있는 형태로 데이터를 변환한 것으로 보면된다.

글자, TEXT 생성

이번시간에서 가장 중요한 내용으로 보면된다.

Hello World라는 문구를 image에 넣을건데,

함수의 이름은 putText이고 인자는 아래와 같다.

cv2.putText(image, 'Text to Display', bottom left starting point, Font, Font Size, Color, Thickness)

그림판(image)에 적을 글자를 입력하고, 글자 왼쪽 아래 시작점을 설정 후 font와 사이즈 색상 두께를 설정해준다.

image = np.zeros((1000,1000,3), np.uint8)
ourString =  'Hello World!'
cv2.putText(image, ourString, (155,290), cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 3, (40,200,0), 4)
imshow("Messing with some text", image)

그림판 : 1000x1000 px
글 : "Hello World!"
글자 폰트 : HERSHEY_SCRIPT_COMPLEX
글 시작위치 : (155,290)
글자 크기 : 3
색상 : (40,200,0)
두께 : 4

결과

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

1개의 댓글

comment-user-thumbnail
2024년 4월 22일

안녕하세요. 현재 자율주행 로봇의 SLAM 알고리즘을 개발하는 업무를 하고 있는 개발자입니다.
image 내 그리는 방법을 상세하게 정리해주셔서 감사합니다~!

블로그의 다른 글들을 살펴보니 computer vision에 관심이 많으신 것 같아 공부하신 경험에 대한 간단한 대화(30~40분)를 나누고 싶어 이메일을 남깁니다.

이메일: irobou0915@gmail.com

LinkedIn profile: https://www.linkedin.com/in/samwoo-seong-037438170/

오늘도 좋은 하루 보내세요!

답글 달기

관련 채용 정보