Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

코딩세상

[이미지] 이미지 데이터 - 딥러닝 이전의 이미지 처리 기법 본문

인공지능

[이미지] 이미지 데이터 - 딥러닝 이전의 이미지 처리 기법

필륭 2023. 9. 12. 13:50

- 전통적인 이미지 처리 기법

 

딥러닝 이전에도 수많은 이미지 처리 기법들이 발전해왔습니다. 대표적인 예로 포토샵을 예로 들 수 있습니다. 포토샵을 통해 원하는 형태로 이미지를 편집할 수 있었으며, 이러한 방법은 현재 딥러닝 모델 학습을 위한 데이터 가공에도 사용하고 있습니다.

 

오늘은 이미지 처리 이미지에서 널리 사용되는 레나 이미지를 바탕으로 이미지 처리에 어떤 방법이 있는지 알아보고 해당 기능을 사용하기 위해 PIL라이브러리에서 어떤 기능들을 사용해야되는지 코드로 알아보겠습니다.

 

 

- 형태 변환

 

잘라내기, 회전, 사이즈 변환 예시

 

  • 잘라내기(Crop) : 이미지 내에서 원하는 위치에서 원하는 크기만큼 이미지를 잘라내는 방법
# 이미지 crop
from PIL import Image

def crop(img, coordinates):
    img_crop = img.crop(coordinates)
    return img_crop

def main():
    img = Image.open("Lenna.png")
    img_crop = crop(img, (150,200, 450, 300))    
    show_image(img_crop, "crop.png")    
    return img_crop
    
if __name__ == "__main__":
	main()

 

  • 회전(Rotate) : 이미지를 원하는 각도로 회전시키는 방법
# 이미지 rotate
from PIL import Image

def rotate(img, angle, expand=False):
    img_rotate = img.rotate(angle, expand= expand)
    return img_rotate

def main():
    img = Image.open("Lenna.png")
    img_rotate = rotate(img, 160, expand=True))    
    show_image(img_rotate, "rotate.png")    
    return img_rotate
    
if __name__ == "__main__":
	main()

 

  • 사이즈 변환(Resize) : 이미지의 크기를 원하는 사이즈로 조절하는 방법
# 이미지 resize
from PIL import Image

def resize(img, new_size):
    img_resize = img.resize(new_size)
    return img_resize

def main():
    img = Image.open("Lenna.png")
    img_resize = resize(img, (640, 360))    
    show_image(img_resize, "resize.png")    
    return img_resize
    
if __name__ == "__main__":
	main()

전단변환, 비율변화의 예시

 

  • 전단변화(Shearing) : 이미지의 전단을 조절하여 이미지를 평행사변형 꼴로 나타내는 방법
# 이미지 shearing
from PIL import Image

def shearing(img, shear_factor):
    img_shearing = img.transform((int(img.size[0] * (1 + shear_factor)), img.size[1]),
                            Image.AFFINE, (1, -shear_factor, 0, 0, 1, 0))
                                 
    return img_shearing

def main():
    img = Image.open("Lenna.png")
    img_shearing = shearing(img, 0.8)   
    show_image(img_shearing, "shearing.png")    
    return img_shearing
    
if __name__ == "__main__":
	main()

 

  • 비율변화(Rescale)  : 이미지의 가로, 세로 비율을 조절하여 이미지의 형태를 변형하는 방법 (.resize()를 사용할 때 좌표 값에 따라 변화하기 때문에 사용 코드는 사이즈 변환과 동일합니다.)

 

 

 

 

 

- 색상 변환

 

밝기 변화, 대조 변화, 흑백 변화 예시

 

  • 밝기 변화(Brightness) : 이미지의 명암비를 조절하여 이미지를 더 어둡게 하거나 밝게하는 방법
# 이미지 밝기 변화

from PIL import Image
from PIL import ImageEnhance


def change_brightness(img, factor):
    bright_enhancer = ImageEnhance.Brightness(img)
    img_bright = bright_enhancer.enhance(factor)
    
	return img_bright
    
 def main():
    img = Image.open("Lenna.png")
    
	# 이미지 밝게 하기
    img_bright = change_brightness(img, 1.5)
    
    # 이미지 어둡게 하기
    img_dark = change_brightness(img, 0.2)
    
	show_image(img_bright, "bright.png")
    show_image(img_dark, "dark.png")
    
    return img_bright, img_dark
    
if __name__ == "__main__":
    main()

 

  • 대조 변화(Contrast) : 이미지의 밝은 부분과 어두운 부분의 차이를 의미하고, 이를 조절하여 이미지의 밝은 부분과 어두운 부분의 차이를 조절하는 방법
# 이미지 대조 변환

from PIL import Image
from PIL import ImageEnhance

def change_contrast(img, factor):

    contrast_enhancer = ImageEnhance.Contrast(img)
    img_contrast = contrast_enhancer.enhance(factor)
    
    return img_contrast
    
def main():
    img = Image.open("Lenna.png")
     # 이미지 대조 줄이기
    img_low_contrast = change_contrast(img, 0.1)
    
    print("=" * 50, "강한 대조 이미지", "=" * 50)
    show_image(img_high_contrast, "high_contrast.png")
    
    print("=" * 50, "약한 대조 이미지", "=" * 50)
    show_image(img_low_contrast, "low_contrast.png")
    
    return img_high_contrast, img_low_contrast
    
if __name__ == "__main__":
    main()

 

  • 흑백 변화(Grayscale) : 이미지를 컬러 이미지에서 흑백 이미지로 변경하는 방법
# 이미지 흑백 변환

from PIL import Image
from PIL import ImageEnhance

def change_grayscale(img):
    img_gray = img.convert('L')
    
    return img_gray
    
def main():
    img = Image.open("Lenna.png")
    
    # 이미지 흑백 변환
    img_gray = change_grayscale(img)
    print("=" * 50, "흑백 이미지", "=" * 50)
    show_image(img_gray, "gray.png")
    
    return img_gray
    
if __name__ == "__main__":
    main()

 

 

- 필터 변환

 

샤프닝, 블러, 경계선 감지

 

  • 샤프닝 (Sharpening) : 이미지 내의 선들을 더 선명하게 하는 방법(샤프닝을 사용하면 사용할수록 더욱 선명해진다.)
# 이미지 필터 변환하기 - 샤프닝

from PIL import Image
from PIL import ImageFilter

def sharpening(img):
    img_sharpen = img.filter(ImageFilter.SHARPEN)
    
    return img_sharpen
    
def main():
    img = Image.open("Lenna.png")
    
    img_sharpen = sharpening(img)
    print("=" * 50, "샤프닝을 적용한 이미지", "=" * 50)
    show_image(img_sharpen, "sharpen.png")
    
    return img_sharpen

if __name__ == "__main__":
    main()

 

  • 블러 (Blur) : 이미지를 뿌옇게 처리하는 방법(블러를 사용하면 할수록 더 뿌옇게 처리된다.)
# 이미지 필터 변환하기 - 블러

from PIL import Image
from PIL import ImageFilter

def blur(img):
    img_blur = img.filter(ImageFilter.BLUR)
    
    return img_blur
    
def main():
    img = Image.open("Lenna.png")
    
    img_blur = blur(img)
    print("=" * 50, "블러를 적용한 이미지", "=" * 50)
    show_image(img_blur, "blur.png")
    
    return img_blur

if __name__ == "__main__":
    main()

 

  • 경계선 감지(Edge Dection) : 이미지 내의 물체를 이루는 외곽선을 감지하여 이를 표시하는 방법
# 이미지 필터 변환하기 - 이미지 경계선 찾기

from PIL import Image
from PIL import ImageFilter

def detect_edge(img):
    img_edge = img.filter(ImageFilter.FIND_EDGES)
    
    return img_edge
    
def main():
    img = Image.open("Lenna.png")
    
    img_edge = detect_edge(img)
    print("=" * 50, "경계선 이미지", "=" * 50)
    show_image(img_edge, "edge.png")
    
    return img_edge

if __name__ == "__main__":
    main()

 

 

 

 

 

 

# 출처 및 참고자료

 

엘리스 AI 트랙 7기 - [이론] 이미지 데이터

 

 

Comments