728x90
반응형
1. Python으로 Dither 만들기: Floyd Steinberg Dithering
지난 글에 Bit Depth를 줄이는 방법으로 Truncation과 Round 두 가지 방법을 확인했다. 이번에는 실제로 Dither를 만들어 볼 것이다.
Floyd Steinberg Dithering 알고리즘을 구현할 것이다.
https://rimeestore.tistory.com/entry/Error-Diffusion%EC%9D%B4%EB%9E%80
위 링크를 따라들어가면 Floyd Steinberg Dithering이 무엇인지 자세히 나와있다.
1.1 Floyd Steinberg Dithering
Code
import numpy as np
from PIL import Image
img = Image.open('in_img/Lenna.jpg') # Import Image
img_arr = np.array(img) # Image to Array
# print(np.shape(img_arr)) # (height, width, pixel)
img_height = np.shape(img_arr)[0]
img_width = np.shape(img_arr)[1]
fsd_img_arr = img_arr / 64
# Floyd Steinberg Dithering
for i in range(img_height):
for j in range(img_width):
old_pix = fsd_img_arr[i][j].copy()
new_pix = np.round( old_pix )
fsd_img_arr[i][j] = new_pix
error = old_pix - new_pix
if j < img_width - 1:
fsd_img_arr[i, j + 1] += error * 7 / 16
if i < img_height - 1:
if j > 0:
fsd_img_arr[i + 1, j - 1] += error * 3 / 16
fsd_img_arr[i + 1, j] += error * 5 / 16
if j < img_width - 1:
fsd_img_arr[i + 1, j + 1] += error / 16
fsd_img_arr = np.clip(fsd_img_arr, 0, 3) # Clip (min = 0, max = 3)
fsd_img_arr = fsd_img_arr * 64
fsd_img_arr = fsd_img_arr.astype(np.uint8) # float to int
fsd_img = Image.fromarray(fsd_img_arr) # Array to Image
fsd_img.save('out_img/Lenna_Floyd_Steinberg.jpg') # Save Image
fsd_img.show() # Show Image
최종 결과
확실히 Floyd Steinberg Dithering이 눈으로 봤을 때는 원본 이미지와 가장 비슷하게 보인다.
728x90
반응형
'Algorithm > Image Processing' 카테고리의 다른 글
Run Length Encoding(RLE)이란? (0) | 2024.11.05 |
---|---|
감마 보정(Gamma Correction)이란? (2) | 2024.11.03 |
[Image Processing] 1. Python으로 Dither 만들기: Truncation, Round (1) | 2023.11.13 |
Error Diffusion이란? (0) | 2023.01.08 |
FRC(Frame Rate Control)란? (0) | 2023.01.08 |
댓글