** 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일차. 그레이 영상처리 프로그램 구조도