Python 04일차



  • Category : Python
  • Tag : Python


** 4일차 (빅데이터 수집 시스템 개발) **

복습 퀴즈 –> Windows 환경에서 작업

이미지를 GUI로 선택하고, 다양한 해상도(1024x1024, 512x512, 256x256 ...)
아무거나 선택해도 처리되도록 한다. (카페 참조)
  • (1) 이미지를 입력한 특정 영역만을 255로 변경한다.

    예) 50, 100 을 입력하면 50~100 영역만 255로 변경하고, 나머지는 그대로

  • (2) 이미지를 입력한 숫자 (예: 4, 8, 16, 32, … 128)로 포스터라이징 한다.

    –> 4가지 색상, 8가지 색상, 16가지 색상….

  • (3) 이미지를 2배 축소시키되, 평균값에 의해서 축소한다.

    –> 축소되는 4점의 평균값

  • (4)<심화> 감마 변환을 구현한다.
  • (5)<심화> 파라볼라 변환을 구현한다.

퀴즈 : 다양한 위젯들을 예쁘게 배치하고, 적당히 클릭하면 작동하는 코드 추가하기…

메뉴도....

** 미션 4일차 **

미션1 :

화소점 처리 --> 동일영상/밝게/어둡게/이진화/이진화(평균값)/이진화(중위수)
영상반전/포스터라이징/감마/파라볼라(캡)/파라볼라(컵)

미션2 :

기하학 처리 --> 미러링(좌우)/미러링(상하)/이동/90도회전/회전/확대/축소

미션3 :

화소영역 처리 --> 블러링/샤프팅/엠보싱/경계추출.......

미션4 :

히스토그램 처리 --> 히스토그램 평활화 .....

04일차. GUI 1

from tkinter import *
from tkinter import messagebox
from tkinter.simpledialog import *

def clickButton() :
    messagebox.showinfo("요긴 제목", "요긴 내용")

def leftMouseClick(event) :
    txt = '클릭한 좌표 -->'
    x = event.x
    y = event.y
    txt += str(x) + ',' + str(y)
    label1.configure(text=txt)

def keyEvent(event) :
    txt = '누른키 -->'
    txt += chr(event.keycode)
    label1.configure(text=txt)

window = Tk()
#window.bind("<Button-1>", leftMouseClick)
window.bind("<Key>", keyEvent)

def openFile() :
    label1.configure(text="메뉴: 파일 >> 열기")

def addImage() :
    value = askinteger("밝게할 값", "값 입력-->", minvalue=1, maxvalue=255)
    label1.configure(text="밝게하기:"+str(value))

### 메뉴 만들기 ###
mainMenu = Menu(window)
window.configure(menu=mainMenu)
fileMenu = Menu(mainMenu)
mainMenu.add_cascade(label="파일", menu=fileMenu)
fileMenu.add_command(label="열기(Open)", command = openFile)
fileMenu.add_separator()
fileMenu.add_command(label="닫기(Close)")
editMenu = Menu(mainMenu)
mainMenu.add_cascade(label="영상처리", menu=editMenu)
editMenu.add_command(label="밝게하기", command=addImage)

######################

window.title("요기 제목")
window.geometry('500x500')
window.resizable(width=False, height=False)
label1 = Label(window, text="안녕하세요")
label2 = Label(window, text="안녕하세요", font=('궁서체', 30), fg='blue', bg='red')
photo = PhotoImage(file='c:/images/gif/dog2.gif')
label3 = Label(window, image=photo )
label3.bind("<Button-1>", leftMouseClick)
button1 = Button(window, text='나를 클릭하세요', fg='red', command=clickButton  )
label1.pack(); label2.pack(); label3.pack()
button1.place(x=300, y=400)
window.mainloop()

04일차. 그레이 포토샵 01

from tkinter import *
from tkinter.filedialog import *
from tkinter.simpledialog import *
import math

### 함수 선언부
#### 공통 함수 ####
def malloc(h, w, value=0) :
    retMemory = [ [ value for _ in range(w)]  for _ in range(h) ]
    return retMemory

def openFile() :
    global window, canvas, paper, inImage, outImage ,inH, inW, outH, outW ,filename

    ## 파일 선택하기
    filename = askopenfilename(parent=window,
        filetypes=( ('RAW 파일', '*.raw'),('All File', '*.*') ) )

    ## (중요!) 입력이미지의 높이와 폭 알아내기
    fsize = os.path.getsize(filename)
    inH = inW = int(math.sqrt(fsize))

    ## 입력이미지용 메모리 할당
    inImage = malloc(inH, inW)

    ## 파일 --> 메모리 로딩
    with open(filename,'rb') as fp :
        for i in range(inH) :
            for k in range(inW) :
                inImage[i][k] = int(ord(fp.read(1)))
    equalImage()
import struct

def saveFile() :
    global window, canvas, paper, inImage, outImage ,inH, inW, outH, outW ,filename
    if filename == '' or filename == None :
        return
    saveFp = asksaveasfile(parent=window, mode='wb', defaultextension='*.raw',
                           filetypes=(('RAW 파일', '*.raw'), ('All File', '*.*')))
    for i in range(outH) :
        for k in range(outW) :
            saveFp.write(struct.pack('B', outImage[i][k]))
    saveFp.close()

def displayImage() :
    global window, canvas, paper, inImage, outImage, inH, inW, outH, outW, filename
    window.geometry(str(outH)+'x'+str(outW))
    if canvas != None :
        canvas.destroy()
    canvas = Canvas(window, height=outH, width=outW)
    paper = PhotoImage(height=outH, width=outW)
    canvas.create_image((outH / 2, outW / 2), image=paper, state='normal')

    # 볼펜으로 콕콕콕 찍기  --> 열라 느림
    # for i in range(outH) :
    #     for k in range(outW) :
    #         r = g = b = outImage[i][k]
    #         paper.put("#%02x%02x%02x" % (r, g, b), (k, i))
    # 메모리에서 처리한 후, 한방에 화면에 보이기 --> 완전 빠름

    rgbString =""
    for i in range(outH) :
        tmpString = "" # 각 줄
        for k in range(outW) :
            r = g = b = outImage[i][k]
            tmpString += "#%02x%02x%02x " % (r, g, b)
        rgbString += '{' + tmpString + '} '
    paper.put(rgbString)
    canvas.pack()

##### 영상처리 함수 ######
def equalImage() :  # 동일영상 알고리즘
    global window, canvas, paper, inImage, outImage, inH, inW, outH, outW, filename
    if filename == '' or filename == None :
        return

    ## (중요!) 출력이미지의 높이, 폭을 결정 ---> 알고리즘에 의존
    outH = inH;    outW = inW

    ## 출력이미지 메모리 할당
    outImage=malloc(outH, outW)

    ### 진짜 영상처리 알고리즘 ###
    for i in range(inH) :
        for k in range(inW) :
            outImage[i][k] = inImage[i][k]

    ########################
    displayImage()

def addImage() :  # 밝게하기 알고리즘
    global window, canvas, paper, inImage, outImage, inH, inW, outH, outW, filename
    if filename == '' or filename == None :
        return

    ## (중요!) 출력이미지의 높이, 폭을 결정 ---> 알고리즘에 의존
    outH = inH;    outW = inW

    ## 출력이미지 메모리 할당
    outImage=malloc(outH, outW)

    ### 진짜 영상처리 알고리즘 ###
    value = askinteger("밝게할 값", "값-->", minvalue=1, maxvalue=255)
    for i in range(inH) :
        for k in range(inW) :
            if inImage[i][k] + value > 255 :
                outImage[i][k] = 255
            else :
                outImage[i][k] = inImage[i][k] + value

    ########################
    displayImage()

### 전역 변수부
window, canvas, paper = None, None, None
inImage, outImage = [], []
inH, inW, outH, outW = [0] * 4
filename = ''



### 메인 코드부
if __name__ == '__main__' :
    window = Tk()
    window.title('그레이 영상처리 Ver 0.01')
    window.geometry('512x512')
    window.resizable(height=False, width=False)

    ### 메뉴 만들기 ###
    mainMenu = Menu(window)
    window.configure(menu=mainMenu)
    fileMenu = Menu(mainMenu)
    mainMenu.add_cascade(label="파일", menu=fileMenu)
    fileMenu.add_command(label="열기(Open)", command=openFile)
    fileMenu.add_command(label="저장(Save)", command=saveFile)
    fileMenu.add_separator()
    fileMenu.add_command(label="닫기(Close)")
    pixelMenu = Menu(mainMenu)
    mainMenu.add_cascade(label="화소점 처리", menu=pixelMenu)
    pixelMenu.add_command(label="동일영상", command=equalImage)
    pixelMenu.add_command(label="밝게하기", command=addImage)

    ######################

    window.mainloop()

04일차. 그레이 영상처리 프로그램 구조도

img


Share this post