python(0821-0908)/메모

초보코딩 pillow : 이미지 다루기 (흑백처리, 모자이크, 도트)

나도초딩 2022. 9. 7.

초보코딩 실습

나도코딩 GUI 실습 후, 관련 예제를 찾아봤다.

Pillow Image 실습. 딱이야!

 

1. 이미지 grey 흑백으로 바꾸기

  • 투명 png 갖다 썼다가 안돼서 헤맸었다. convert('RGB') 필요
  • r.size 로 이미지의 크기 (전체 픽셀수) 구하고,
  • r.getpixel( i, j )
  • r.putpixel((i,j), ( , , , ) 
from PIL import Image
import matplotlib.pylab as plt
import os

# 이미지 흑백으로 바꾸기: rgb평균값으로 동일하게 putpixel
im = Image.open("pica2.jpg")
r = im.convert('RGB')
# plt.imshow(r) # r을 plotting(가시화)한다.
# plt.show()

# 이미지 크기 구해서, 반복할 횟수
print(r.size)
# print(r.size[0])
# print(r.size[1])

# print(r.getpixel((450,300)))
for i in range(0, r.size[0]):
    for j in range(0, r.size[1]):
        rgb = r.getpixel((i,j))
        a_rgb = round((rgb[0]+rgb[1]+rgb[2])/3)
        r.putpixel((i,j),(a_rgb,a_rgb,a_rgb))
        
# plt.imshow(r)
# plt.show()

r.save("C:/Users/kang/Desktop/grey.jpg")

2. 모자이크 처리(crop, paste) : 캔버스 키우기

m_size : 반복 간격 px

m_size**2

 

from PIL import Image
import matplotlib.pylab as plt
import os

#2 20px 단위로, 모자이크 찍어보기

im = Image.open("pica2.jpg")
r = im.convert('RGB')
# plt.imshow(r) # r을 plotting(가시화)한다.
# plt.show()


print(r.size) # 이미지 크기 구해서, 반복할 횟수
m_size = 20 # 20px 단위로 점찍기, 20** rgb평균내기
### 1 캔버스 확대 Image.new(), paste
mod_x = r.size[0] % m_size
mod_y = r.size[1] % m_size
pad_x = m_size - mod_x
pad_y = m_size - mod_y
new_x = r.size[0] + pad_x
new_y = r.size[1] + pad_y
# print(new_x,new_y)
canvas = Image.new(r.mode,(new_x, new_y), (255,255,255))
# 땡! canvas = Image.new((new_x, new_y), (255,255,255))
canvas.paste(r, (0,0))
r=canvas
# plt.imshow(new_r)
# plt.show()
### 2. 20px*20px 의 평균 -> putpixel
i, j = (0,0)
for i in range(0, r.size[0], m_size):
    for j in range(0, r.size[1], m_size):
        # r.putpixel((i,j),(0,0,0)) # m_size마다 점찍기 테스트
        r_sum = 0
        g_sum = 0
        b_sum = 0
        for ii in range(i, i+m_size):
            for jj in range(j, j+m_size):
                rgb = new_r.getpixel((ii,jj)) 
                r_sum +=rgb[0]
                g_sum +=rgb[1]
                b_sum +=rgb[2]
                # b_rgb += new_r.getpixel(new_r,(ii,jj))[1]    
                # c_rgb += new_r.getpixel(new_r,(ii,jj))[2]    
        r_a = round(r_sum/m_size**2)
        g_a = round(g_sum/m_size**2)
        b_a = round(b_sum/m_size**2)

        for ii in range(i, i+m_size):
            for jj in range(j, j+m_size):
                r.putpixel((ii,jj),(r_a,g_a,b_a))

        

plt.imshow(r)
plt.show()

# r.save("C:/Users/kang/Desktop/grey.jpg")

3. 도트 처리 : 모자이크처리와 유사. putpixel 값 추출 방법의 차이

모자이크 처리 : m_size = 20 이면, 20x20px 의 평균 rgb 값으로

도트 처리 : 지정한 5개의 rgb 리스트와 가장 유사한(=차이가 작은) rgb 값으로.

시나리오 : 5 색상 추출(pyauto 마우스 위치로 rgb 5가지 색깔 선택) --> color_list = [(255,255,255),(0,0,0),(,,),(,,),(,,)]

5색중 가장 가까운 색상으로  putpixel ::: append 로 abs(r - c[0]) 리스트 만든 후, min(rgb_point)

 

c_list = [(255,255,255),(0,0,0),(254,38,12),(255,216,26), (229,141,21)] # 추출한 것으로 가정
r_a, g_a, b_a = (234,234,20) #c_list와 비교

rgb_point = [] # c_list 와 비교한 값을 담기 위한 리스트
for c in c_list:
    # print(abs(r_a-c[0])+abs(g_a-c[1])+abs(b_a-c[2]))
    rgb_point.append(abs(r_a-c[0])+abs(g_a-c[1])+abs(b_a-c[2]))

min_rgb = rgb_point.index(min(rgb_point))

댓글