Python tkinter 강좌 : 제 32강 - OpenCV 적용하기

Python tkinter applying OpenCV

Python tkinter 강좌 : 제 32강 - OpenCV 적용하기
[ Python-Tkinter ] - 윤대희

OpenCV 적용하기


1 OpenCVtkinter를 결합해 GUI로 표시할 수 있습니다.

이 때 PIL 라이브러리를 활용합니다.

PIL 모듈은 Python Imaging Library로, 다양한 이미지 파일 형식을 지원하는 범용 라이브러리입니다.



OpenCV & PIL


import cv2
import tkinter
from PIL import Image
from PIL import ImageTk

def convert_to_tkimage():
    global src

    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    _, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)

    img = Image.fromarray(binary)
    imgtk = ImageTk.PhotoImage(image=img)

    label.config(image=imgtk)
    label.image = imgtk

window=tkinter.Tk()
window.title("YUN DAE HEE")
window.geometry("640x480+100+100")

src = cv2.imread("giraffe.jpg")
src = cv2.resize(src, (640, 400))

img = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)

img = Image.fromarray(img)
imgtk = ImageTk.PhotoImage(image=img)

label = tkinter.Label(window, image=imgtk)
label.pack(side="top")

button = tkinter.Button(window, text="이진화 처리", command=convert_to_tkimage)
button.pack(side="bottom", expand=True, fill='both')

window.mainloop()


import cv2
import tkinter
from PIL import Image
from PIL import ImageTk


상단에 from PIL import Image, from PIL import ImageTk를 사용하여 PIL 모듈을 포함시킵니다.

OpenCVnumpy 형식 이미지를 표시하려면 PIL 모듈을 사용합니다.


img = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)

tkinter의 색상 체계는 OpenCV와 다르게 RGB 패턴을 사용합니다.

그러므로, BGR에서 RGB로 변환합니다.


img = Image.fromarray(img)
imgtk = ImageTk.PhotoImage(image=img)

PIL.Image 모듈의 fromarray 함수를 활용해 Numpy 배열을 Image 객체로 변환합니다.

PIL.ImageTk 모듈의 PhotoImage 함수를 활용해 tkinter와 호환되는 객체로 변환합니다.


label=tkinter.Label(window, image=imgtk)
label.pack(side="top")

라벨(Label)image 매개변수에 imgtk를 적용해 이미지를 표시할 수 있습니다.


button=tkinter.Button(window, text="이진화 처리", command=convert_to_tkimage)
button.pack(side="bottom", expand=True, fill='both')

버튼(Button)command 매개변수에 convert_to_tkimage 함수를 실행시킵니다.


def convert_to_tkimage():
    global src

    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    _, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)

    img = Image.fromarray(binary)
    imgtk = ImageTk.PhotoImage(image=img)

    label.config(image=imgtk)
    label.image = imgtk

global src를 적용해 src 변수를 가져옵니다.

이진화를 처리한 다음, 앞의 형식과 동일하게 tkinter와 호환되는 이미지로 변환합니다.

이미지를 갱신하기 위해 config를 통해 image 매개변수를 설정합니다.

또한, 가비지 컬렉터(garbage collector)가 이미지를 삭제하지 않도록 라벨의 image 매개변수에 imgtk한 번 더 등록합니다.



Result


2


도움이 되셨다면 광고 클릭 부탁드립니다.


Book Image

책이 출간되었습니다!

C#과 파이썬을 활용한 OpenCV 4 프로그래밍

컴퓨터 비전 기초 이론부터 머신러닝을 활용한 영상 처리 프로젝트까지

  • C# OpenCvSharp4
  • Python OpenCV4
  • Using Tesseract
  • Using TensorFlow
  • Using Regular Expression
  • 윤대희 저 | 위키북스

    [yes24 바로가기] [알라딘 바로가기] [교보문고 바로가기]


    ⤧  Previous post Python tkinter 강좌 : 제 31강 - Separator ⤧  Next post Python tkinter 강좌 : 제 33강 - 매개변수 전달
    Python-Tkinter Category