반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

2022.03.11 - [파이썬 패키지/라이브러리&패키지 소개] - 파이썬 주요 라이브러리 정리


업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

이번 시간에는 qrcode와 segno 패키지로 qrcode를 생성하는 방법을 공부해보겠습니다.

 

두 패키지를 모두 학습하는 이유는 qrcode는 png, jpeg, bmp 등의 이미지 형식의 확장자로만 qrcode가 저장되며, 여러 옵션을 선택할 수 있지만 SVG 형태로 저장이 불가능하기 때문입니다. 확대 시에도 이미지가 깨지지 않는 SVG 확장자로 저장하기 위해서는 segno 패키지를 사용하여야 합니다.

 

두 패키지 모두 사용법이 정말 간단하니 아주 쉽게 업무에 적용하실 수 있을거예요!


1. qrcode 라이브러리

 

1) 설치

 

 설치는 pip install qrcode 명령을 cmd 창 혹은 주피터노트북 창에 입력하시면 됩니다.

pip install qrcode

 

 

2) 초간단 사용법

 

 사용법은 매우 간단합니다. 아래의 코드가 qrcode 라이브러리의 거의 전부거든요.

import qrcode

# 데이터 생성
data = "https://www.example.com"
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4,
)

# 데이터 추가
qr.add_data(data)
qr.make(fit=True)

# QR 코드 이미지 생성
img = qr.make_image(fill='black', back_color='white')

# 이미지 파일로 저장
img.save("example_qr.png")

  

보시면 다양한 옵션이 있는데 이 옵션들이 무엇을 의미하는지 하나씩 설명드리겠습니다.

 

[version]

QR 코드의 버전을 지정합니다. 값은 1에서 40 사이여야 하며, 숫자가 높을수록 QR 코드의 크기가 커지고 더 많은 데이터를 저장할 수 있습니다.


[error_correction]

 QR 코드의 오류 보정 수준을 설정합니다. 즉 QR 코드가 더럽혀지거나 손상되었을 때도 원하는 url 페이지로 이동할 수 있게 해주는 수준에 대한 옵션입니다. 다음 네 가지 수준 중 하나를 선택할 수 있습니다.


ERROR_CORRECT_L: 약 7%의 오류를 복구
ERROR_CORRECT_M (기본값): 약 15%의 오류를 복구
ERROR_CORRECT_Q: 약 25%의 오류를 복구
ERROR_CORRECT_H: 약 30%의 오류를 복구

 

참고로 오류 복구 수준이 높아질 수록 Data Size가 커진다고 하지만 제가 테스트 해보니 유의미한 차이는 없었습니다. 또한 ChatGPT에게 오류 복구 수준이 높아지만 훼손된 QR코드가 원하지 않는 url로 이동하는 링크로 복구 해주는 것이 아니냐는 질문에는 그렇지는 않다고 하네요.

 

 

[box_size]

QR 코드의 각 박스(픽셀)의 크기를 지정합니다. 이 값은 생성되는 이미지의 전체 크기에 영향을 미칩니다. 아래는 box_size를 10으로 했을 때와 100으로 했을 때의 크기 차이입니다.


[border]

QR 코드 이미지 주변의 테두리 크기를 박스 단위로 지정합니다. 기본값은 4입니다.

2. segno 라이브러리

 

1) 설치

 

 설치는 pip install qrcode 명령을 cmd 창 혹은 주피터노트북 창에 입력하시면 됩니다.

pip install segno

 

 

2) 초간단 사용법

 

 segno의 사용법은 더 간단합니다.

import segno

# QR 코드 생성
qr = segno.make("https://www.google.com", error='H', version=3)

# SVG 형식으로 저장
qr.save('qr-segno.svg', scale=10)

  

segno 패키지는 크게 make 함수와 save 함수가 있습니다. qrcode 패키지와 마찬가지로 다양한 옵션이 있는데 필요한 옵션들 위주로 각각 무엇을 의미하는지 하나씩 설명드리겠습니다.

 

make 함수의 옵션

 

[error]
QR 코드의 오류 보정 수준을 설정합니다. 가능한 값은 'L', 'M', 'Q', 'H' 입니다. 위에서 배운 qrcode와 동일한 개념이므로 자세한 설명은 생략하겠습니다.


[version]
QR 코드의 버전을 설정합니다. 별도로 설정하지 않으면 기본적으로 segno가 자동으로 적절한 버전을 선택합니다. 마찬가지로 위에서 배운 qrcode와 동일한 개념이므로 자세한 설명은 생략하겠습니다.

 

[micro]
True로 설정하면 마이크로 QR 코드를 생성합니다. 마이크로 QR 코드는 작은 양의 데이터를 위해 최적화된 작은 QR 코드입니다. 제가 테스트 해보니 url 데이터는 담지 못하고 숫자나 문자 정도만 담을 수 있습니다.

 

 

save 함수의 옵션

 

save 함수의 경우에는 위에서 배웠던 box_size 옵션과 비슷하게 scale 옵션을 이용하여 qrcode의 사이즈를 조절할 수 있고, bolder 옵션과 같이 quiet_zone 옵션을 이용하여 여백의 사이즈를 조절할 수 있습니다.

 

[scale]
QR 코드의 크기를 조정합니다. scale 값은 QR 코드의 각 모듈(픽셀)의 크기를 결정합니다. 예를 들어, scale=2는 기본 크기의 두 배 크기로 QR 코드를 생성합니다.

 

[quiet_zone]
QR 코드 주변의 여백(quiet zone)의 크기를 설정합니다. 이 값은 모듈의 수로 지정되며, QR 코드 표준에 따라 기본값은 4입니다.

 

[kind]
저장할 파일의 형식을 지정합니다. 예를 들어, 'png', 'svg', 'eps', 'pdf' 등을 지정할 수 있습니다. 파일 확장자를 통해 자동으로 결정되기도 하지만, 이 옵션을 통해 명시적으로 형식을 지정할 수 있습니다.

 


오늘 준비한 내용은 여기까지입니다.

 

최근 글을 블로그에 소홀해서 글을 많이 올리지 않았는데 좀 더 분발해 보도록 해보겠습니다.

반응형
반응형

* 주의. 비전공자가 공부하면서 대충 정리한 글이므로, 정확하지 않을 수 있으며 대략적인 느낌만 참고할 것

 

1. 컴퓨터 비전의 기반 기술

 

1) 영상의 필터링

- 영상에서 필요한 정보(신호)만 통과시키고 원치 않는 정보(노이즈)를 걸러내는 작업

- 목적에 따라서 영상을 흐리게 만들거나 더 선명하게 만들어 영상처리의 효율을 높일 수 있음

 

2) 기하학적 변환

- 영상을 이동, 회전, 반전, 확대, 축소

- 비스듬히 찍힌 명함이나 문서등을 마치 스캔한 듯이 변환할 때 활용 가능

 

3) 영상의 특징추출

- 배경과 객체, 또는 객체와 객체의 경계인 엣지(Edge)를 픽셀 값의 급격한 변화를 감지함으로써 검출

- 특정한 사물이나 사람의 얼굴을 인식하기 위해서 활용 가능

- 예를 들어 인체의 특징점을 추출함으로써 어떤 포즈를 취하고 있는지도 인식하는데에 응용  

 

4) 이진 영상 처리

- 관심 대상과 비관심 대상을 0과 255(흑과 백)으로 명확히 구분 짓기 위해서 하는 작업

- 임계값(treshold)를 기준으로 흑과 백을 나눔

- 관심 대상을 더욱 두드러지게 표현하여 영상처리의 효율을 높이기 위함

 

 

2. 컴퓨터 비전으로 무엇을 할 수 있을까?

 

1) 검출

- 원하는 대상의 위치와 크기 정보를 얻을 수 있으며,  더 나아가서 움직이는 영상에서 객체의 움직임을 추적 가능

- 아래의 이미지는 검출과 인식을 함께 구현한 것

 

2) 인식

- 개와 고양이의 이미지를 보고 '개'와 '고양이'라고 명확히 알려주는 것이 식별(identification)

- 개와 고양이의 이미지를 수 백장이 섞여있을 때, 이를 끼리끼리 나눠주는 것이 분류(classification)

- 인쇄체, 필기체 숫자 혹은 글자 인식, 얼굴 인식

 

 

3) 추적

- 검출을 동영상에서 계속 하면 추적이 됨 

- 보행자 추적, 자동차 추적


<참고 자료>

 

패스트 캠퍼스 강의_OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 


 

1. 덧셈

 

이미지를 더해줄 때는 cv2.add( ) 함수를 사용해줍니다. 참고로 앞으로 src와 dst라는 파라미터를 많이 언급할텐데, srcsource의 약자, dstdestination의 약자로 각각 inputoutput으로 이해하시면 편하실거예요.

 

cv2.add(src1, src2, dst=None, mask=None, dtype=None)

 

이때 여러 파라미터들 중에서, 반드시 값을 넣어주어야 하는 2가지가 있는데 바로 src1과 src2입니다.

 

보통 src1은 이미지 파일, 정확히는 이미지 파일의 경로를 입력해주며,

src2에는 src1과 동일하게 이미지 파일을 입력해주거나, 스칼라 값(픽셀 값)을 숫자로 입력해줍니다.

 

두 가지 경우가 어떻게 다른지 천천히 알아보겠습니다.

 

 

1)  이미지 + 스칼라 값 (밝기 조절)

 

이미지에 스칼라 값을 넣어준다는 의미는 밝기를 조절한다는 것입니다. 흑백과 컬러 이미지에 대해서 어떻게 처리해는지 코드와 결과를 보면서 파악해 보세요.

 

<코드>

import cv2

# 흑백 이미지 불러오기
src = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)
dst = cv2.add(src, 50)

cv2.imshow('src', src)
cv2.imshow('dst', dst)

cv2.waitKey()

# 컬러 이미지 불러오기
src = cv2.imread('cat.jpg')

#여기서 50, 50, 50, 0은 각각 B,G,R,alpha(투명도)를 나타냄
dst = cv2.add(src, (50, 50, 50, 0)) 

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()

cv2.destroyAllWindows()

 

<실행 결과>

흑백
컬러

 

2) 이미지 + 이미지

 

이번에는 이미지끼리 더해보겠습니다. 완전 다른 이미지 두 개를 더해줄 수도 있지만 쉬운 이해를 위해서 흰색 바탕에 검은색 원의 이미지를 생성해서 더해줘보겠습니다. 

 

 

 

<코드>

import cv2

# 그레이스케일로 이미지 불러오기
src1 = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)
src2 = cv2.imread('mask_circle.jpg', cv2.IMREAD_GRAYSCALE)

# 이미지 2개 더하기
dst = cv2.add(src1, src2)

cv2.imshow('dst', dst)

cv2.waitKey()

cv2.destroyAllWindows()

 

<실행 결과>

 

그레이스케일 영상에서 검은색은 0, 흰색은 255의 값을 가지므로, 검은색 원이 있던 부분은 원래의 고양이 사진을 그대로 출력하며, 흰색이었던 부분은 모두 흰색으로 출력되는 것을 확인 하실 수 있습니다. 참고로 두 이미지의 픽셀값을 더했을 때 255를 넘으면 모두 255(흰색)으로 출력됩니다.

src1 + src2

 

2. 가중치 덧셈

 

그렇다면 이미지를 각자 다른 비율로 더해주고 싶을 땐 어떻게 해야할까요? 그럴 땐 아래의 함수를 사용해주시면 됩니다.

 

cv2.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)

 

방금 전 코드에서 cv2.add( ) 부분의 코드를 아래의 코드로만 바꿔주면 되므로 전체 코드는 생략하도록 하겠습니다.

dst = cv2.addWeighted(src1, 0.5, src2, 0.5, 0)

 

<실행 결과>

 

 

3. 뺄셈

 

뺄셈은 덧셈과 개념이 매우 흡사하므로 이해하기 쉬우실 거예요.

 

 

이 것 역시 이전 덧셈 코드에서 cv2.add( ) 코드 한줄만 아래의 코드로 바꿔주시면 됩니다.

dst = cv2.subtract(src1, src2)

 

<실행 결과>

 

여기서도 0보다 작은 음수는 픽셀값이 0으로 자동으로 변환되어 검은색으로 표현되는 것에 주의해주세요.

 

4. 차이계산

 

차이 계산은 두 영상 사이에 차이가 생긴 부분만 나타내주는 연산입니다.

 

cv2.absdiff(src1, src2, dst=None)

 

CCTV로 주차장을 찍으며 실시간으로 차이계산을 하고, 변화가 생겼을 때만 알람을 띄워주는 알고리즘을 만든다면 효과적일 것 같네요.

 

출처. OpenCV를 활용한 컴퓨터비전과 딥러닝_패스트 캠퍼스 강의

 

오늘은 이러한 개념이 있다는 것만 알고 넘어가도록 하겠습니다.

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.


<참고 자료>

 

패스트 캠퍼스 강의_OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

 

시작하기에 앞서, OpenCV 라이브러리는 쥬피터 노트북에서 한줄한줄 실행하기 보다는 그냥 파이썬 파일(.py)에서 전체 코드를 실행하시는 것을 추천드립니다. imshow( )로 창을 띄우고 종료할 때 자꾸 파이썬 인터프리터가 먹통이 되더라구요.

 

참고로 이번 시간에는 카메라가 내장된 노트북이나 별도의 웹캠이 없으시다면 실습이 어렵답니다.

 

일단은 여러분들이 노트북을 가지고 코딩공부를 하고 계신다는 가정 하에 글을 작성하겠습니다.


1. OpenCV로 내장 카메라 영상 출력하기

 

이번 시간 가장 처음배워볼 것은 카메라 영상을 받아서 모니터에 띄워보는 것입니다.

 

복잡한 설명 없이 바로 코드를 실행해보겠습니다.

 

<코드>

# step1.opencv 라이브러리 불러오기
import cv2

# step2.카메라 열기 - 0은 기본 카메라를 의미
cap = cv2.VideoCapture(0)

# step3.무한 반복
while True:
    # 카메라 연결 여부(True/False)와 현재 프레임 이미지를 읽음
    retval, frame = cap.read()
    
    # 만약 카메라가 연결되어 있지 않으면 while 반복문 종료
    if retval == False:
        break
    
    # 'frame'이란 창 이름으로 현재 프레임 출력
    cv2.imshow('frame', frame)

    # 10초가 지나거나, ESC 키가 입력되면 while 반복문 종료
    if cv2.waitKey(10) == 27:
        break

# step4.카메라 닫고 모든창 종료
cap.release()

cv2.destroyAllWindows()

 

<실행 결과>

부끄러워서 숨어서 화면 캡쳐함

 

OpenCV에서는 카메라 영상과 이어서 배울 동영상 파일로부터 프레임(frame)을 받아오는 작업을 cv2.VideoCapture 클래스 하나로 처리합니다.

 

위의 코드에서는 cap이라는 변수로 cv2.VideoCapture 클래스를 객체화 해서 while 반복문 안에서 사용하고 있는 것을 보실 수 있을거예요.

 

참고로 cv2.VideoCapture(0)의 0은 기본 카메라를 의미하기 때문에 카메라가 한 대라면 그냥 고민 없이 0을 넣어 주시면 되고, 카메라가 두 대 이상이라면 장치관리자 표시되는 순서대로 1, 2를 입력해주시면 됩니다.

 

 

2. OpenCV로 동영상 파일 재생하기

 

위에서 말씀드렸 듯이 OpenCV를 이용해서 동영상 파일을 열 때도  cv2.VideoCapture 클래스를 이용합니다.

 

차이점은 cv2.VideoCapture( ) 안에 0 대신에 파일명을 넣어주면 됩니다.

 

아무 영상이나 아래의 사이트에서 다운로드 받으신 후에 적당한 파일명으로 저장해주세요. 물론 저장위치는 현재 작업경로에 넣어주시면 코딩하기 제일 편합니다.

 

픽사베이: https://pixabay.com/ko/videos/

 

저는 귀여운 하이랜드 소의 영상을 다운로드 받았습니다. 

 

 

이번에도 코드를 먼저 보시겠습니다.

 

만약 동영상을 그대로 재생하고 싶으시다면 방금 전 봤던 코드에서 한 줄만 바꿔주면 됩니다. 실행결과는 생략하도록 하겠습니다.

 

<코드>

# step1.opencv 라이브러리 불러오기
import cv2

# step2.동영상 파일 열기
cap = cv2.VideoCapture('하이랜드 소.mp4')

# step3.무한 반복
while True:
    # 동영상 파일 존재 여부(True/False)와 현재 프레임 이미지를 읽음
    retval, frame = cap.read()
    
    # 만약 동영상 파일이 존재하지 않으면 while 반복문 종료
    if retval == False:
        break
    
    # 'frame'이란 창 이름으로 현재 프레임 출력
    cv2.imshow('frame', frame)

    # 10초가 지나거나, ESC 키가 입력되면 while 반복문 종료
    if cv2.waitKey(10) == 27:
        break

# step4.동영상 파일 닫고 모든창 종료
cap.release()

cv2.destroyAllWindows()

 

3. 영상의 기본 정보 가져오기

 

이번에는 영상의 정보(영상의 프레임 사이즈, 전체 프레임수, FPS 등)를 가져오는 것을 배워보겠습니다. 이 내용은 카메라 영상과 동영상 파일 모두 적용 가능하지만, 저는 동영상 파일을 가지고 진행해보겠습니다.

 

<코드>

# step1.opencv 라이브러리 불러오기
import cv2

# step2.영상 파일 열기
cap = cv2.VideoCapture('하이랜드 소.mp4')

# step3.영상의 가로, 세로 사이즈, 전체 프레임수, FPS 등을 출력
print('Frame width:', int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))
print('Frame height:', int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('Frame count:', int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))
print('FPS:', cap.get(cv2.CAP_PROP_FPS))

# step4.영상 닫고 모든창 종료
cap.release()

 

<실행결과>

 

더 많은 영상 정보는 아래의 OpenCV 공식 사이트를 참고하셔서  get( ) 괄호 안만 바꿔주시면 됩니다.

 

https://docs.opencv.org/4.1.0/d4/d15/group__videoio__flags__base.html#gaeb8dd9c89c10a5c63c139bf7c4f5704d

 

OpenCV: Flags for video I/O

enum  cv::VideoCaptureAPIs {   cv::CAP_ANY = 0,   cv::CAP_VFW = 200,   cv::CAP_V4L = 200,   cv::CAP_V4L2 = CAP_V4L,   cv::CAP_FIREWIRE = 300,   cv::CAP_FIREWARE = CAP_FIREWIRE,   cv::CAP_IEEE1394 = CAP_FIREWIRE,   cv::CAP_DC1394 = CAP_FIRE

docs.opencv.org

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.


<참고 자료>

 

패스트 캠퍼스 강의_OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 


 

1. OpenCV로 불러온 이미지의 속성 확인하기

 

OpenCV 라이브러리는 이미지를 numpy.ndarray로 표현하며, 이 배열의 각 요소값(픽셀값, 보통 0~255) 들이 모여서 이미지로 표현되는 방식입니다.

 

출처. OpenCV를 활용한 컴퓨터 비전과 딥러닝

 

따라서 cv2.imread( ) 함수로 어떤 이미지를 불러오면 컴퓨터는 numpy.ndarray로 표현하며, 불러온 이미지는 아래와 같은 4가지 속성을 가집니다.

 

1) ndim: 차원의 수

     - 그레이스케일 영상: 2

     - 컬러 영상: 3

 

2) shape: 각 차원의 크기

     - 그레이스케일 영상: (h, w)

     - 컬러 영상: (h, w, 3)

 

3) size: 전체 원소 개수 (전체 픽셀의 갯수)

     - 그레이스케일 영상: h x w

     - 컬러 영상: h x w x 3

 

 

4) dtype: 원소의 데이터 타입. 영상 데이터는 uint8

     - 그레이스케일 영상: cv2.CV_8UC1 numpy.uint8, shape = (h, w)

     - 컬러영상: cv2.CV_8UC3numpy.uint8,shape=(h,w,3)

 

 

코드로 이미지 하나를 흑백과 컬러로 불러와서 각 속성들이 어떤 값을 갖는지 확인해보세요.

 

# step1.OpenCV 라이브러리 불러오기
import cv2

# step2.고양이 이미지 흑백과 컬러로 가져오기 
img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)

# step3.이미지의 여러가지 속성들이 어떤 값을 가지는지 확인해보기 (size, shape, ndim, dtype)

print('#img1')
print('shape:', img1.shape)
print('size',img1.size)
print('ndim:',img1.ndim)
print('dtype:',img1.dtype)

print('#img2')
print('shape:', img2.shape)
print('size:',img2.size)
print('ndim:',img2.ndim)
print('dtype:',img2.dtype)

 

<출력 결과>

#img1
shape: (480, 640)
size 307200
ndim: 2
dtype: uint8
#img2
shape: (480, 640, 3)
size: 921600
ndim: 3
dtype: uint8

 

2. 원하는 사이즈의 이미지 생성하기 

 

OpenCV는 위에서 보셨 듯이 numpy 패키지의 ndarray로 이미지 표현합니다.

 

따라서 이미지를 새로 생성하기 위해서는 numpy 패키지를 이용해서 ndarray를 생성하고 배열의 요소에 값들을 채워넣어주어야 하죠.

 

이미지는 아래와 같은 방식으로 생성 가능합니다. 아직 어디 쓰일지는 모르겠으니 이런 것이 있다는 것 정도만 알고 넘어가겠습니다.

 

import cv2
import numpy as np

img1 = np.zeros((480, 640, 3), dtype=np.uint8)  # color image
img2 = np.ones((480, 640), dtype=np.uint8) * 255  # white
img3 = np.full((480, 640, 3), (0, 255, 0), dtype=np.uint8)  # green

cv2.imshow('image1', img1)
cv2.waitKey()
cv2.imshow('image2', img2)
cv2.waitKey()
cv2.imshow('image3', img3)
cv2.waitKey()

cv2.destroyAllWindows()

 

<실행 결과>

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.


<참고 자료>

 

패스트 캠퍼스 강의_OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 


 

1. 컴퓨터 비전 기초 of 기초

 

컴퓨터 비전에 대해서 모두 다루기엔 너무 방대한 학문이기 때문에, OpenCV를 다루기 위해서 필요한 지극히 기초적인 내용만 다루겠습니다.

추후에 OpenCV를 다루면서 필요한 이론이 있으면 그때 그때 추가적으로 공부하도록 하겠습니다. 

 

 

1) 컴퓨터 비전(Computer vision)이란?


컴퓨터를 이용하여 정지영상 또는 동영상으로부터 의미있는 정보를 추출하는 방법을 연구하는 학문
, 사람이 눈으로 사물을 보고 인지하는 작업을 컴퓨터가 수행


2) 영상(image)이란?

픽셀(pixel)이 바둑판 모양의 격자에 나열되어 있는 형태 (2차원행렬)

픽셀: 영상의 기본 단위, picture element, 화소

 

 

3) 그레이스케일(grayscale) 영상

그레이스케일 영상

흑백 사진이 바로 그레이스케일 영상입니다. 색상 정보(R,G,B) 없이 오직 밝기 정보만 가지고 있는 영상이죠. 참고로 컴퓨터 비전에서는 사진도 영상이라고 부른답니다.

그레이스케일 영상은 픽셀 하나를 0~255 범위의 정수로 표현합니다. (0이 검정, 255가 흰색)

 

 

4) 트루컬러(truecolor) 영상

트루컬러 영상

 

일반적인 컬러 사진으로 R, G, B 색 성분의 크기를 각각 0 ~ 255 범위의 정수로 표현한 영상입니다

 

 

 

2. OpenCV 기초

 

1) 설치하기

# 기본 모듈 패키지
pip install opencv-python

# 전체 패키지(주 모듈과 contrib/추가 모듈 모두 포함)
pip install opencv-contrib-python

 

2) 라이브러리 불러오기

import cv2

 

3) 사진 불러오기

 

cv2.imread( ) 함수는 인자를 2개 받는데, 첫번째는 가져오고자 하는 파일의 경로, 두번째는 파일을 어떤 컬러 옵션으로 가져올 것인지에 대한 내용입니다. 이때, 이미지(img)는 numpy.ndarray 형식으로 저장됩니다.

 

아래의 코드는 현재 작업경로와 이미지 파일이 존재할 때만 사용할 수 있다는 점 주의해주세요.

img = cv2.imread('파일명.확장자', cv2.IMREAD_COLOR)

<옵션>

cv2.IMREAD_COLOR (기본값)

cv2.IMREAD_GRAYSCALE

cv2.IMREAD_UNCHANGED

 

 

4) 사진 출력하기

 

위에서 사진을 불러온 것은 단지 img라는 이름의 변수에 저장해둔 상태입니다. 사진을 창에 띄워서 출력하기 위해서는 cv.imshow( ) 함수를 사용해줍니다. 

 

cv2.imshow('출력할 창 이름', img)

 

좀 더 제대로 하면 미리 창을 만들어주고, 창 옵션도 설정하고 해줄 수 있지만 생략하도록 하겠습니다. 안해줘도 출력은 되고 처음부터 많은 걸 배우면 혼란스럽기만 하니깐요.

 

5) 키보드 입력 대기

 

위에서 사진을 출력하면 순식간에 사진이 떴다가 사라집니다. 그래서 키보드 입력이 들어올 때 까지 사진을 띄워놓을 수 있도록 cv2.waitKey( ) 함수를 사용해줍니다.

 

cv2.waitKey()

 

함수의 인자로는 밀리세컨드(ms)가 들어가는데, 해당 시간동안 기다려 주겠다는 의미이며, 미입력시 무한히 기다립니다.

 

만약 특정키가 눌렸을 때만 반응하고 싶다면 아래와 같이 코딩해주시면 됩니다.

 

# 27(ESC), 13(ENTER), '알파벳'도 가능
while True:
    if cv2.waitKey() == ord(27):
        break

 

6) 창 닫기

 

위에서 키를 누른 후, 창이 닫히는 것이 목적이라면 아래의 코드를 넣어주어야 합니다.

 

특별한 목적이 없는 한, 그냥 심플하게 모두 닫는게 좋겠습니다.

# 창을 모두 닫고 싶을 때
cv2.destroyAllWindows()

# 원하는 창만 닫고 싶을 때
cv2.destroyWindow('특정 창 이름')

 

<전체 코드>

import cv2

img = cv2.imread('ch01/cat.bmp', cv2.IMREAD_GRAYSCALE)

cv2.imshow('image', img)

cv2.waitKey()

cv2.destroyAllWindows()

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.


<참고 자료>

 

패스트 캠퍼스 강의_OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

 

<Pillow 관련 글>

 

2021.11.08 - [파이썬 패키지/사무자동화] - [Python/Pillow] 파이썬 이미징 라이브러리(PIL)_1편.Pillow 설치 및 이미지 불러오기

2021.11.09 - [파이썬 패키지/사무자동화] - [Python/Pillow] 파이썬 이미징 라이브러리(PIL)_2편.이미지 크기 변경(resize), 자르기(crop), 회전(rotate), 대칭(flip), 그리고 저장(save)

2021.11.10 - [파이썬 패키지/사무자동화] - [Python/Pillow] 파이썬 이미징 라이브러리(PIL)_3편.이미지 흑백으로 만들기, 필터 적용(Blur, Edge)

2021.11.10 - [파이썬 패키지/사무자동화] - [Python/Pillow] 파이썬 이미징 라이브러리(PIL)_4편.이미지에 글자(워터마크) 추가하는 법(ft. OSError: cannot open resource)

 


 

지난 시간에는 아래와 같이 사진 하나에 '코딩유치원'이라는 워터마크를 넣는 방법을 배워보았습니다.

 

 

하지만 우리가 그림판에서도 가능한 이 작업을 굳이 파이썬을 사용해서 하는 이유는 반복적인 작업을 컴퓨터에게 부탁하기 위해서죠.

 

그래서 오늘은 지난 시간의 코드를 조금만 수정해서 지정한 폴더 내의 jpg 파일에 한꺼번에 워터마크를 넣는 방법을 배워보겠습니다.

 

1. 전체 코드

 

먼저 완성된 코드를 보여드리겠습니다. 지난 시간에 비해서 추가되거나 수정된 코드는 별도로 주석에 표시해두었으니 비교하시면서 살펴보시면 더 이해가 빠르실거예요!

 

# 1.이미지 처리에 필요한 PIL의 모듈 import
from PIL import  Image, ImageDraw, ImageFont

# (추가) 파일 경로 관련 모듈 import
import glob

# (추가) 타겟 폴더 정보 입력
file_path = '/Users/sangwoo/Desktop/img_download/'

# (추가) 타겟 폴더에서 jpg 파일의 경로들을 리스트로 저장
list_images= glob.glob(file_path + '*.jpg')

# (추가) 파일 이름 저장 시, 변경해줄 번호
i = 0

# (추가) 반복을 위한 for문
for image in list_images:

    # 2.워터마크 삽입할 이미지 불러오기
    img = Image.open(image)
    width, height = img.size

    # 3.그림판에 이미지를 그대로 붙여넣는 느낌의 Draw() 함수 
    draw = ImageDraw.Draw(img)

    # 4.삽입할 워터마크 문자
    text = "코딩유치원"

    # step5.삽입할 문자의 폰트 설정
    font = ImageFont.truetype('/Users/sangwoo/Downloads/나눔 글꼴/나눔손글씨_펜/NanumPen.ttf', 30)

    # 6.삽입할 문자의 높이, 너비 정보 가져오기
    width_txt, height_txt = draw.textsize(text, font)

    # 7.워터마크 위치 설정 (margin을 margin_x,margin_y로 나누어서 사용해도 됨)
    margin = 10
    x = width - width_txt - margin
    y = height - height_txt - margin

    # 8.텍스트 적용하기
    draw.text((x, y), text, fill='white', font=font)

    # 9.(생략) 이미지 출력
    # img.show()
    
    # (수정) 10. 지정한 폴더에 완성 이미지 저장
    i = i+1
    img.save(file_path + f'{i}.jpg')

 

 

2. 코드 설명

 

코드는 지난 시간에 비해 추가된 부분 위주로 설명드리겠습니다.

 

1) 이미지 파일의 경로 관련 코드

 

오늘은 폴더 안에 들어있는 파일들의 경로를 모두 받아 올 수 있도록 해주는 모듈인 glob 모듈을 사용합니다. 가볍게 import 해줍니다.

# (추가) 파일 경로 관련 모듈 import

import glob

 

그 다음으로는 준비한 이미지 5개가 들어있는 폴더의 경로('/Users/sangwoo/Desktop/img_download/')를 확인해주시고, 다음 코드의 file_path 변수에 여러분들의 이미지가 있는 폴더 경로를 담아줍니다.

 

그 아래의 코드는 방금 import 해준 glob 모듈의 glob 함수로 파일 경로들을 가져오는 것입니다.

 

더 자세히 설명하면, 우리가 지정한 file_path 안의 jpg 파일 경로들을 리스트로 저장하는 코드입니다.

 

# (추가) 타겟 폴더 정보 입력
file_path = '/Users/sangwoo/Desktop/img_download/'

# (추가) 타겟 폴더에서 jpg 파일의 경로들을 리스트로 저장
list_images= glob.glob(file_path + '*.jpg')

 

이미지 5개가 들어있는 폴더와 경로

 

2) 이미지 워터마크 삽입 반복문

 

이제는 지난 시간 작성했던 코드를 for 반복문 안에 넣어주어야 합니다.

 

그 전에 가장 마지막 단계에서 워터마크 삽입된 사진을 저장할 때를 위해서 i라는 변수를 만들어 0을 넣어줍니다.

(이걸 안해주고 그냥 '파일이름.jpg'로 해주면 가장 마지막 사진만 저장되는 참사가 일어날 거예요ㄷㄷ)

 

# (추가) 파일 이름 저장 시, 변경해줄 번호
i = 0

# (추가) 반복을 위한 for문
for image in list_images:


	(지난 시간의 코드와 동일)
    
    
    # (수정) 10. 지정한 폴더에 완성 이미지 저장
    i = i+1
    img.save(file_path + f'{i}.jpg')

 

다음으로는 for 문을 잠시 살펴보겠습니다.

 

for문은 아까 list_images에 담아두었던 이미지 파일들의 경로들을 하나씩 꺼내어 image라는 변수에 담아서 워터마크 작업을 반복합니다.

 

작업이 완료 되었으면 i를 1씩 상승시켜주면서 파일을 같은 폴더 내에 저장해줍니다.

 

워터마크 작업이 완료된 상태의 폴더

 

참고로 사진의 크기를 조금 달리 해봤는데, 해상도가 큰 사진은 워터마크가 비교적 작게 표현되는 한계점이 있는 코드인 듯 합니다.

 

이 부분은 삽입할 이미지의 크기에 따라서 fontsize와 margin을 수정하는 방식으로  개선할 수 있겠네요.

 


오늘 준비한 내용은 여기까지입니다.

 

오늘도 공부하시느라 고생 많으셨습니다~!

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 이미지를 많이 다루고 처리하는 분들을 위해서 파이썬으로 이미지를 다룰 수 있게 해주는 Pillow라는 라이브러리에 대해서 공부해보겠습니다.

 

이번 시간에는 이미지에 워터마크를 넣는 방법을 배워보겠습니다.


 

인터넷 상에 사진이 포함된 글을 보다보면 아래와 같이 워터마크를 포함한 사진을 보신적이 있으실 거예요.

 

이런 워터마크 작업을 많이 하시는 분들은 사진들을 한 폴더에 두고, 자동으로 워터마크를 찍어주는 코드를 사용하면 참 편하겠죠?

 

 

먼저 전체 코드를 보겠습니다.

 

# step1.필요한 PIL의 모듈 3가지 import
from PIL import  Image, ImageDraw, ImageFont

# step2.워터마크 삽입할 이미지 불러오기
img = Image.open('cat.jpg')
width, height = img.size

# step3.그림판에 이미지를 그대로 붙여넣는 느낌의 Draw() 함수 
draw = ImageDraw.Draw(img)

# step4.삽입할 워터마크 문자
text = "코딩유치원"

# step5.삽입할 문자의 폰트 설정
font = ImageFont.truetype('/Users/sangwoo/Downloads/나눔 글꼴/나눔손글씨_펜/NanumPen.ttf', 30)

# step6.삽입할 문자의 높이, 너비 정보 가져오기
width_txt, height_txt = draw.textsize(text, font)

# step7.워터마크 위치 설정
margin = 10
x = width - width_txt - margin
y = height - height_txt - margin

# step8.텍스트 적용하기
draw.text((x, y), text, fill='white', font=font)

# step9.이미지 출력
img.show()

# step10.현재작업 경로에 완성 이미지 저장
img.save("cat_watermakr.jpg")

 

너무 길어서 조금 부담스러우신가요? 걱정마시고 저랑 차근차근 하나씩 살펴 보시죠.

 

step1 & step2

# 1.필요한 PIL의 모듈 3가지 import
from PIL import  Image, ImageDraw, ImageFont

# 2.워터마크 삽입할 이미지 불러오기
img = Image.open('cat.jpg')
width, height = img.size

 

우선 Pillow 라이브러리에서 필요한 친구들만 import 해줍니다.

 

Image: 이미지를 불러오고 보여주는 역할(가장 기본적이고 필수적인 모듈)

ImageDraw: 우리가 사진을 편집해 줄 그림판과 같은 역할

ImageFont: 폰트 종류와 크기 설정

 

그 다음엔 워터마크를 넣어 줄 이미지를 한장 불러온 뒤, 나중에 사용하기 위해서 이미지의 사이즈 정보도 변수에 담아줍니다.

 

 

step3 & step4

# step3.그림판에 이미지를 그대로 붙여넣는 느낌의 Draw() 함수 
draw = ImageDraw.Draw(img)

# step4.삽입할 워터마크 문자
text = "코딩유치원"

 

step3은 불러온 이미지를 그림판에 복붙해주는 느낌으로 생각하시면 됩니다. step4에서는 넣어줄 워터마크의 내용을 입력해주세요.

 

step5

# step5.삽입할 문자의 폰트 설정
font = ImageFont.truetype('/Users/sangwoo/Downloads/나눔 글꼴/나눔손글씨_펜/NanumPen.ttf', 30)

 

가장 핵심인 5단계는 따로 떼어내서 설명드리려 합니다. 왜 핵심이냐?! 에러가 가장 많이 발생할 가능성이 높기 때문입니다.

 

아래는 구글링을 하다보면 볼 수 있는 코드입니다.

font = ImageFont.truetype('arial.ttf', 30)

 

 이 코드를 그대로 입력하셨다면 거의 99% 확률로 아래와 같은 문구의 에러가 출력됩니다.

(1%는 해당 ttf 파일이 현재 작업 경로에 들어있거나 폰트가 들어있는 디렉토리를 환경변수로 설정해둔 경우입니다.)

 

OSError: cannot open resource

 

한마디로 너가 사용하겠다는 폰트를 못찾겠다는 말입니다.

 

그렇다면 우리는 어떻게 해야할까요? 사용하고 싶은 폰트를 다운로드 받고 폰트의 위치를 컴퓨터에게 알려주면 됩니다.

 

폰트는 저작권이 무료이고, 나름 퀄리티 좋은 네이버 나눔 글꼴을 추천드립니다.

(마음에 안드신다면 무료 글꼴을 제공하는 기업들이 있으니 검색해보시길 추천드립니다)

 

https://hangeul.naver.com/2017/nanum

 

네이버 글꼴 모음

네이버가 만든 150여종의 글꼴을 한번에 만나보세요

hangeul.naver.com

 

위의 링크에서 나눔글꼴을 다운로드 받으셨다면 압축을 푸시고 폴더를 열어주세요.

 

저는 아래의 여러 글꼴들 중에서 나눔손글씨_펜 폴더 안의 NanumPen.ttf 파일을 선택했습니다.

 

 

만약 경로의 개념을 잘 몰라서 경로를 어떻게 입력해야할지 모르시겠다면, 해당 파일을 커맨드(cmd) 창에 드래그&드롭 해보세요.

 

경로가 출력된답니다. 그걸 그대로 복사해서 아래의 코드에 붙여넣으시면 됩니다. 참고로 오른쪽에 숫자는 글자 크기입니다.

 

font = ImageFont.truetype('여기 경로를 붙여넣으세요', 30)

 

<주의>

 

만약 나눔폰트가 아닌 한글을 지원하지 않는 폰트를 선정하면 아래와 같은 오류가 출력됩니다.

 

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)

 

step6 & step7

# step6.삽입할 문자의 높이, 너비 정보 가져오기
width_txt, height_txt = draw.textsize(text, font)

# step7.워터마크 위치 설정
margin = 10
x = width - width_txt - margin
y = height - height_txt - margin

 

길었던 폰트 설정을 마치고 이제 해줄 부분은 워터마크의 위치에 대한 설정입니다.

 

아까 저장해뒀던 draw 객체(안에는 사진이 복붙된 그림판이 들어있음)는 textsize( ) 함수를 이용해서 텍스트의 너비와 높이 정보를 가져 올 수 있습니다.

 

이렇게 얻은 정보를 이미지 전체의 너비, 높이, 그리고 사진 구석에서 얼마나 띄울 것인지(margin)를 계산해서 워터마크의 시작위치(왼쪽위 꼭지점)의 위치를 정해줍니다.

 

step8 & step9 & step10

# step8.텍스트 적용하기
draw.text((x, y), text, fill='white', font=font)

# step9.이미지 출력
img.show()

# step10.현재작업 경로에 완성 이미지 저장
img.save("cat_watermakr.jpg")

 

이제 남은 것은 그림판에 문자를 입력하고, 결과를 출력하고 저장하는 것입니다.

 

만약 글자 색상을 설정해주는 fill을 설정 해주지 않으면 'white'가 기본값으로 들어가 있으며, 이 색깔은 CSS 컬러, HEX 컬러 모두 적용 가능합니다.

 

색상은 아래의 링크를 참고해서 마음에 드시는 것으로 골라서 넣으시면 됩니다.

https://namu.wiki/w/%ED%97%A5%EC%8A%A4%20%EC%BD%94%EB%93%9C

 

마지막 step10의 경우는 저장이 필요없으시면 하지 않으셔도 됩니다.

 


오늘 준비한 내용은 여기까지입니다.

 

오늘도 공부하시느라 고생 많으셨습니다!

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 이미지를 많이 다루고 처리하는 분들을 위해서 파이썬으로 이미지를 다룰 수 있게 해주는 Pillow라는 라이브러리에 대해서 공부해보겠습니다.

 

오늘 배워볼 내용은 컬러 이미지를 흑백으로 만드는 것과 이미지에 필터 효과를 주는 방법입니다.

 

시작하기에 앞서 관련 패키지를 import하고 첫 시간에 다운로드 받았던 고양이 사진을 불러오겠습니다.

 

# Pillow 라이브러리 불러오기
from PIL import Image

# 고양이 이미지 불러와서 img라는 변수에 입력
img = Image.open('cat.jpg')

 

1. 컬러 이미지 흑백으로 만들기

 

이미지의 모드(mode)를 변환시킬 때는 convert( ) 함수를 사용합니다. 이미지의 모드에는 정말 다양한 형식들이 있지만 우리가 일상에서 사용할만한 것은 RGB 트루 컬러(8bit)와 흑백(8bit)가 거의 대부분이 아닐까 합니다.

 

# RGB로 표현된 컬러 이미지를 흑백으로 변경
img_gray = img.convert("L")

# 흑백으로 변환된 이미지 출력
img_gray.show()

 

<출력 결과>

 

참고로 위의 코드를 실행하시면 우측의 흑색 사진만 출력되지만 비교를 위해서 원본 이미지도 넣었습니다.

 

'L' 대신에 다양한 mode들을 넣으시면 다른 이미지가 출력되니 궁금하신 분들은 테스트 해보세요.

 

1 (1비트 픽셀, 흑백, 바이트당 1픽셀로 저장)

L (8비트 픽셀, 흑백)

P (8비트 픽셀, 색상 팔레트를 사용하여 다른 모드에 매핑됨)

RGB (3x8비트 픽셀, 트루 컬러)

RGBA (4x8비트 픽셀, 투명 마스크가 있는 트루 컬러)

CMYK (4x8비트 픽셀, 색상 분리)

YCbCr (3x8비트 픽셀, 컬러 비디오 형식)

LAB (3x8비트 픽셀, L*a*b 색 공간)

HSV (3x8비트 픽셀, 색조, 채도, 값 색 공간)

I (32비트 부호 있는 정수 픽셀)

F (32비트 부동 소수점 픽셀)

 

참고링크: https://pillow.readthedocs.io/en/stable/handbook/concepts.html

 

 

2. 이미지에 필터 부여하기

 

이미지에 필터를 부여하고 싶을 때에는 filter( ) 함수를 사용합니다. 단, 필터 함수를 사용하려면 아래의 모듈을 import 해주어야 합니다.

 

from PIL import ImageFilter

 

제공 되는 필터는 아래의 필터들 외에도 다양하며, 아래의 링크를 참고하셔서 사용하시면 됩니다.

 

https://pillow.readthedocs.io/en/stable/_modules/PIL/ImageFilter.html#MaxFilter

 

  • BLUR : BLUR, BoxBlur( ), GaussianBlur( )
  • MedianFilter( ), MinFilter( ), MaxFilter( ) 등
  • CONTOUR
  • DETAIL
  • EDGE_ENHANCE, EDGE_ENHANCE_MORE
  • EMBOSS
  • FIND_EDGES
  • SHARPEN
  • SMOOTH, SMOOTH_MORE

 

사용 방법은 아래와 같습니다.

 

1) 블러 효과를 주고 싶을 때

# Blur 효과를 줄 때 가장 많이 사용하는 가우시안 블러 --> 숫자를 크게 할 수록 흐려짐
img_blur = img.filter(ImageFilter.GaussianBlur(10))

# 이미지 출력
img_blur.show()

 

2) 이미지의 엣지를 더 강조하고 싶을 때

img_edge = img.filter(ImageFilter.EDGE_ENHANCE)

img_edge.show()

 


오늘 준비한 내용은 여기까지입니다.

 

다음 시간에는 이미지에 텍스트(워터마크)를 넣는 방법을 공부해 보겠습니다.

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 이미지를 많이 다루고 처리하는 분들을 위해서 파이썬으로 이미지를 다룰 수 있게 해주는 Pillow라는 라이브러리에 대해서 공부해보겠습니다.

 

시작하기에 앞서 관련 패키지를 import하고 지난 시간에 다운로드 받았던 고양이 사진을 불러오겠습니다.

 

# Pillow 라이브러리 불러오기
from PIL import Image

# 고양이 이미지 불러와서 img라는 변수에 입력
img = Image.open('cat.jpg')

 

1. 이미지 크기 변경

 

이미지 크기 변경은 resize( ) 함수를 사용합니다. 사이즈는 튜플 형식 (width, height)으로 입력해줍니다.

 

# 이미지 사이즈 변경
img_resized = img.resize((400,300))

# 변경한 이미지 출력
img_resized.show()

# 비교를 위해 원본 이미지 출력
img.show()

 

<출력 결과>

 

 

2. 이미지 자르기

 

이미지의 일부분을 얻고 싶을 때는 crop( ) 함수를 사용합니다. 마찬가지로 인자를 튜플 형태 (left, upper, right, lower)로 입력 받습니다.

쉽게 생각해서 좌측상단의 xy좌표, 우측하단의 xy좌표를 차례대로 받는다고 생각하시면 돼요.

 

# 이미지 자르기
img_cropped = img.crop((0,0,300,300))

# 잘라낸 이미지 출력
img_cropped.show()

 

<출력 결과>

 

 

3. 이미지 회전

 

이미지를 회전 하고 싶으면 rotate( ) 함수를 사용합니다. 입력 인자는 각도입니다.

 

# 이미지 90도 회전
img_rotated = img.rotate(90, expand=1)

# 회전한 이미지 출력
img_rotated.show()

 

<출력 결과>

 

만약 expand 옵션을 설정해주지 않거나 0(기본값)으로 설정해주면, 원래 사진의 크기에 사진만 회전되어 잘려서 출력됩니다.

 

4. 이미지 대칭

 

이미지를 상하 혹은 좌우 대칭시키고 싶으면 transpose( ) 함수를 사용합니다. 입력 인자는 6가지가 있는데 대칭에 사용하는 인자는 아래의 2가지입니다. 나머지 인자들은 90도, 180도, 270도 회전과 관련되어 있습니다.

 

좌우대칭: Image.FLIP_LEFT_RIGHT

상하대칭: Image.FLIP_TOP_BOTTOM

 

# 좌우대칭
img_flipped_LR = img.transpose(Image.FLIP_LEFT_RIGHT)
img_flipped_LR.show()

# 상하대칭
img_flipped_TB = img.transpose(Image.FLIP_TOP_BOTTOM)
img_flipped_TB.show()

 

<출력 결과>

 

5. 이미지 저장

 

지금까지 편집한 이미지를 저장하려면 save( ) 함수를 사용하면 됩니다. 입력 받는 인자로는 '파일명.확장자' 혹은 '파일의 경로'입니다.

 

# 상하반전한 이미지 저장
img_flipped_TB.save('cat_flip.jpg')

 

<저장된 이미지>

 


오늘 준비한 내용은 여기까지입니다.

 

오늘도 공부하시느라 고생 많으셨습니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 이미지를 많이 다루고 처리하는 분들을 위해서 파이썬으로 이미지를 다룰 수 있게 해주는 Pillow라는 라이브러리에 대해서 공부해보겠습니다.

 

1. Pillow란?

 

Python Imaging Library(PIL)라는 파이썬 이미지 처리 라이브러리의 지원이 2011년 중단되고, Pillow가 PIL의 후속 프로젝트로 나왔습니다. 즉, Pillow가 공식 PIL이라고 보면 되겠네요. 실제로 import 할 때에도 PIL이라는 이름을 사용한답니다.

 

다룰 수 있는 이미지 파일 형식으로는 PPM, PNG, JPEG, GIF, TIFF, BMP 등이 있으며, 지원하지 않는 파일 형식은 라이브러리를 확장해서 새로운 파일 디코더를 만드는 것이 가능하다고 합니다.

 

PIL 이미지 작업으로는 아래의 기능들이 가능합니다.

  • 픽셀 단위의 조작
  • 마스킹 및 투명도 제어
  • 흐림, 윤곽 보정 다듬어 윤곽 검출 등의 이미지 필터
  • 선명하게, 밝기 보정, 명암 보정, 색 보정 등의 화상 조정
  • 이미지에 텍스트 추가
  • 기타 등등

 

2. Pillow 설치하고 불러오기

 

pillow를 설치하는 방법은 매우 간단합니다. 아래의 코드를 커맨드 창에서 입력해주시면 됩니다. 만약 아나콘다 패키지를 설치하신 분들은 conda 명령어를 이용하여 설치해주셔도 됩니다. (만약 이미 설치되어 있다면 이 과정을 생략하셔도 됩니다)

 

pip install pillow

 

설치가 완료되었거나 이미 설치되어 있으신 분들은 아래의 코드로 Pillow를 불러올 수 있습니다.

 

#import PIL로 불러올 시, Image 모듈은 안불러와져서 에러가 뜸

from PIL import Image

 

 그냥 import PIL로 하면 될 것 같지만 Image 모듈이 불러와지지 않는답니다. 이 부분은 다른 패키지나 라이브러리를 다룰 때에도 종종 볼 수 있는 현상인데, 아직 공부가 부족해서 왜 그런지는 잘 모르겠습니다.

 

 

3. 실습 이미지 다운로드 및 Pillow로 Open하기

 

함께 실습할 이미지를 다운로드 하기 위해서 저작권이 무료이미지를 마음껏 받을 수 있는 Pixabay로 접속해 보겠습니다.

 

https://pixabay.com/ko/

 

해당 링크에 접속하셨으면 검색창에 고양이를 검색하고 아래의 이미지를 다운로드해주세요. 사진 사이즈는 가장 작은 640x426 사이즈로 받아볼게요.

 

 

아마 파일명이 'cat-gf5d169137_640.jpg'로 다운로드 받아졌을텐데 사용하기쉽도록 'cat.jpg'로 바꿔주세요.

 

파일의 위치는 현재 파이썬 파일이 존재하는 폴더에 함께 놔둬 주세요. 이렇게 하면 복잡하게 경로를 입력해줄 필요없이 불러올 때 'cat.jpg'만 입력해주면 되거든요. 아래와 같이 말이죠.

 

# 고양이 이미지 불러와서 img라는 변수에 입력
img = Image.open('cat.jpg')

# 이미지 보여주기
img.show()

 

결과를 볼까요? 요상한 이름과 PNG로 불러와졌지만 일단 사진은 맞네요.

 

 

4. 이미지 속성 확인

 

불러온 이미지 이름, 확장자, 사이즈, 색상 모드 등의 속성을 확인 가능합니다. 출력결과는 >>> 로 표시하였습니다.

 

# 이미지 파일명
print(img.filename)
>>> cat.jpg

# 이미지 형식
print(img.format)
>>> JPEG

# 이미지 크기
print(img.size)
>>> (640, 426)

# 이미지 너비
print(img.width)
>>> 640

# 이미지 높이
print(img.height)
>>> 426

# 이미지의 색상 모드
print(img.mode)
>>> RGB

 


오늘 준비한 내용은 여기까지 입니다.

 

다음 시간에는 Pillow를 이용한 이미지의 크기 변경, 회전, 자르기, 뒤집기에 대해 공부해보겠습니다.

반응형

+ Recent posts