딥러닝

10강 - OpenCV와 함께하는 이미지 기초 - 이미지에 그리기 - 1부 - 기본 도형

인생진리 2023. 6. 26. 22:52

다시 오신 것을 환영합니다
이번 강의 1부에서는 이미지 그리는 방법부터 설명하겠습니다
일단 직사각형이나 원 같은 도형부터 몇 개 그려본 다음
이미지 위에 텍스트 등을 넣는 방법을 보여 드릴게요
새 노트북을 열어 볼까요?
자, 열었으니 시작하겠습니다 매번 기본적으로 쓰는 import부터 시작할게요
{import cv2} {import numpy as np}
{import matplotlib.pyplot as plt} {%matplotlib inline}이라고 쓰면 됩니다


그런 다음 빈 이미지를 생성할 거예요 {blank_img = np.zeros}인데
지금은 단순한 도형을 만들 거니까
{(512,512,3)}로 색상 채널은 3개로 하고 데이터 타입도 지정합니다
{dtype=np.int16)}
좋아요, 다음 줄로 넘어가서 확인해 봅시다 {blank_img. shape}
(512, 512, 3)입니다
이건 임의로 선택한 숫자입니다
여러분에게 보여주기 좋은 작은 사이즈예요 {plt.imshow(blank_img)}를 입력하면 빈 이미지가 나타납니다

예상했듯이 색상이 전부 'zero'라서
(512, 512, 3)인 도형은 완전히
검정색으로 나올 겁니다
그러면 이미지 위에 다른 도형을 그리는 방법을 가르쳐 드릴게요
이 이미지 위에 직사각형을 그릴 거예요
{cv2.rectangle}를 입력합니다 그다음 어떤 이미지 위에
그릴지를 입력합니다
{(blank_img)} 위에 그릴 거예요
그다음 꼭짓점 2개를 설정하는데, 첫 번째 꼭짓점 위치는 첫 번째 튜플에,
두 번째 꼭짓점 위치는 두 번째 튜플에 조합해서 넣습니다
첫번째 꼭짓점, 즉 직사각형의 첫 번째 꼭짓점은
왼쪽 맨 위에 있는 점이고, 두 번째 꼭짓점은 오른쪽 맨 밑에 있는 점을
가리킵니다
자, 어떤 식으로 하는지 볼까요?
첫 번째 꼭짓점의 X를 384, Y를 0으로 설정하면
위치가 여기쯤 될 겁니다
X=384, Y=0으로 넣습니다 그리고 두 번째 꼭짓점은
도형을 거의 끝으로 보낼 거니까
숫자는 510입니다 왜 512가 아니냐 하면
그럴 경우 경계를 살짝 넘어가기 때문에
510으로 하는 거예요 그리고 도형을 밑으로 조금 내려주기 위해
여기에 150을 입력합니다
그리고 색상을 지정합니다 그냥 RGB 코드를 넣으면 돼요
이번에는 그냥 기본 단색으로 넣었습니다 그리고 선 굵기도 따로
지정할 수 있습니다
선의 두께를 몇 픽셀로 할지 정하는 거예요
아주 두껍게 하고 싶으니 10 픽셀로 넣을게요 그런데 주의할 점이 있어요
이건 결과값을 내지는 않고
이미지에 직접 작용합니다
그러니까 이건 이미지 위에 넣는 영구적인 표시 같은 거죠
기억해 두세요
이걸 실행시키면 배열이 나타납니다


하지만 말씀드렸다시피 이건 도형 안에서 이뤄진 작업입니다
이 빈 이미지를 다시 보기 위해 {plt.imshow(blank_img)}를 복사해
붙여 넣겠습니다
여기 붙여 넣으면 직사각형이 나타납니다 그런데 선 굵기가
왼쪽과 아래쪽은 굵고 오른쪽과 위쪽은 가늘게 보이죠?
선의 굵기가 선의 한가운데에서부터 끝 방향으로 측정되기 때문입니다
그래서 왼쪽과 오른쪽으로 5픽셀씩, 또는 위아래로 5픽셀씩 나뉘게 되는 거죠
하지만 도형을 끝부분에 거의 닿도록 위치시켰기 때문에 그 픽셀을
다 표시하지 못해서 조금 불균형해 보이는 겁니다

그래서 직사각형의 두 꼭짓점을 경계선에서 조금 떼어놓을 거예요
그래서 여기는 500 정도로 하고 여기는 원래 0이었으니까
대략 10으로 할게요, 다시 실행하면, 빈 이미지를 다시 로딩해 볼게요
빈 이미지를 초기화하고 이걸 다시 실행시킨 다음 괜찮아졌는지
봅시다
실행해 보면 모서리가 균등해진 걸 알 수 있죠


그럼 다시 정리하면, 직사각형을 그리려면 첫 번째, 왼쪽 위 꼭짓점과, 두 번째, 오른쪽 아래 꼭지점을
설정하면 됩니다
대각선으로 마주보는 두 점을 지정하는 건데요, 이렇게 하면 자동으로
직사각형이 그려집니다 두 꼭짓점만 있으면 알아서
가로방향, 세로방향의 직선이 그어져서 직사각형이 생기는 거예요
그러면 이번에는 가운데쯤에 사각형을 그려 봅시다
어떻게 하면 될까요?
자, 아까처럼 {cv2.rectangle}을 입력하고
그리고 싶은 이미지를 설정해야 하니까 {blank_img}라고 쓰고
왼쪽 위 꼭짓점과 오른쪽 아래 꼭짓점을 지정합니다
한가운데에 도형을 그릴 거니까, 총 길이가 512일 때 중간 지점이 어딘지
알아야겠죠
첫 번째 꼭짓점부터
해 볼게요
(200, 200) 정도로 하면 적당하겠네요
그래서 (200, 200)을 넣습니다 다음, 두 번째 꼭짓점은 조금 떨어진 데로 보내야겠네요
그래서 여긴
(300, 300)으로 합니다
{(300, 300)}을 입력하고 색상을 선택합니다 이번에도 RGB 코드를 넣을게요
원하는 색 아무거나 좋아요 255를 넣은 다음, 선을 더 두껍게 만들어 봅시다
두께는 대략 10으로 하고 실행시킵니다
그러면 배열이 나오는데 이걸 저장할 수도 있어요
여기 모든 업데이트가 포함되어 있지만, 거의 다 0이네요
기본적으로 표시되지 않은 배열이 더 있다는 뜻이죠
{plt.imshow(blank_img)}를 실행하면 여기 예쁜 파란 사각형이 생긴 걸 볼 수 있어요
정사각형입니다


자, 이번에도 왼쪽 위와 오른쪽 아래 꼭짓점을 X 값과 Y 값으로 지정했죠?
그리고 빨강, 녹색, 파랑 색상 값을 선택하고
마지막으로 선 두께를 정했어요 어떤 도형을 그릴지도 지정했고요
이번에는 원을 그려볼 거예요 원도 비슷한 방법으로 그리면 됩니다
{cv2.circle(blank_img)}를 입력합니다
이제 제가 이 매개변수들이 뭘 의미하는지 명확히 설명할게요
첫째 파라미터 img는 어떤 도형 위에 그리느냐 하는 것이고
다음은 중심 파라미터입니다
X축과 Y축의 어느 지점에 원의 중심이 위치할 것인가를 나타내죠
여기 왼쪽 위에 원을 그린다고 생각해 봅시다
X 값은 100, Y 값도 100
그러면 중심이 (100, 100)에 위치하겠죠
중심을 정했으면 이제 원의 반지름을 정해야죠
원이 중심에서 얼마나 멀리까지 확장되면 좋을까요?
저는 반지름을 50픽셀로 넣어 보겠습니다
그리고 색상을 선택합니다
이번에도 원색인 빨강을 선택하겠습니다
빨강, 녹색, 파랑 순서인데 빨강은 255, 녹색과 파랑은 0입니다
다음으로 선 두께를 정할게요
지금 보여 드리기 위해서
임의로 넣는 건데, 8로 하겠습니다
그런 다음 바로 {plt.imshow(blank_img)}를 입력합니다

됐습니다 여기 원이 보이네요 약간 깨진 듯하지만 그건 우리가 512 * 512라는
상당히 낮은 해상도로 작업하고 있기 때문입니다
만약 빈 도형 말고 색이 칠해진 원이나 사각형을 만들고 싶다면 그것도 가능합니다
방법은 아주 쉬워요 그냥 선 두께를 '-1'로 설정하기만 하면 됩니다
무슨 얘긴지 보여드릴게요
이 코드를 복사해서 붙여 넣겠습니다
이 아래에 원 하나를 더 그릴 텐데 이번엔 오른쪽 맨 아래에 그려
볼게요
원 중심은 (400, 400)에 위치하는 걸로
지정하겠습니다
그리고 이번엔 원을 채우기 위해서 두께에 마이너스 숫자를 넣을 텐데 {thickness=(-1)}이라고
입력할게요
실행하면 -1로 채워진 원이 나타나네요
사각형에도 같은 방법을 쓰면 됩니다
채우고 싶다면 실제 선 두께 말고 '-1'을 넣으세요


그럼 마지막으로 선 긋는 법과 텍스트 넣는 법을 알려드리겠습니다, 2부에서는 다각형 만드는 법을
가르쳐 드릴 거예요
자, 선을 그어 볼게요 예상하셨겠지만, {cv2.line}을 입력합니다
그런 다음 어떤 도형을 그릴지 지정합니다
그리고 선의 첫 번째 점의 X 값과 Y 값, 두 번째 점의
X 값과 Y 값, 그리고 색상, 선 두께를 넣습니다 이건 사각형을
그릴 때와 똑같습니다
자, 왼쪽 맨 위에서부터 오른쪽 맨 아래로 뻗은 직선을 그려 봅시다
그러니까 여긴 (0, 0)이 되겠죠
오른쪽 맨 아래의 두 번째 점은 (512, 512)가 될 테고요
색상을 넣을 차례인데, 제가 지금 빨강, 녹색, 파랑 코드를 하나 복사해서
붙여 넣겠습니다 그리고 두께를 지정합니다
두께는 5로 하고요, {plt.imshow}를 입력합니다
그러면 빈 이미지가 어떻게 달라질까요? 실행해 보면 이렇게 됩니다


선이 (0, 0)의 점에서부터 직선으로 (512, 512)의 점까지 쭉 이어져
있습니다
자, 여러분
우리는 오늘 선과 사각형과 원을 그리는 법을 배웠습니다
그리고 실제 원과 사각형을 채우는 법, 색을 정하는 법, 선 두께를 정하는 법도
배웠습니다
다음 시간까지 도형 그리기를 마무리할 거예요
2부에서는 도형 위에 텍스트를 넣는 법, 직접 만든 다각형을 그려넣는 법을 설명하겠습니다
이제 거의 끝났습니다
2부에서 이 두 가지 주제를 마무리하도록 하죠 다음에 만나요

이미지에 그리기 - 1부 - 기본 도형.ipynb
0.10MB