파이썬 이미지 처리 : 리사이즈, 필터(Sharpen, Blur), 흑백, 세피아 변환 – 사진 커뮤니티, e커머스가 적용되는 실전 이미지 처리방법

안녕하세요. 모두 스택의 개발자인 이라테입니다.들어가기 전에 간단히 파이썬의 PIL(Pillow)을 이용하고 구상을 리사이즈하는 방법과 이미지에 사후 처리 필터를 적용하고 셔플과 블러를 처리하는 방법을 공유합니다.이 방식은 내가 2003년 사진 커뮤니티(studiosign)에서 사용하고 2022년의 실제 e커머스에서도 적용한 방법입니다.특히 셔플 필터의 값은 아마 국내에서 유일하게 공개하는 것 아닌가 싶습니다.( 대단한 것도 없지만).보통 셔플의 예제는 아주 강할 내용밖에 없어요.통상 백엔드에서 파일이 업로드되면 이벤트에서 트리거를 받고, 그 파일에 대한 후 처리를 하게 됩니다.요즘은 AWS CloudFront와 Lamda를 이용하고 현금 처리를 하는 방식 CDN을 이용하는 경우가 많지만 뒷감당을 적용하면 우선 사진의 품질을 높이고 파일 크기를 적정하게 유지하는 것으로 이 방식을 많이 하게 될 것입니다.파이썬에서는, 화상의 읽는 법을 쉽게 제공되고 있습니다.opencv를 쓰지 않아도 됩니다.

안녕하세요. 모두 스택의 개발자인 이라테입니다.들어가기 전에 간단히 파이썬의 PIL(Pillow)을 이용하고 구상을 리사이즈하는 방법과 이미지에 사후 처리 필터를 적용하고 셔플과 블러를 처리하는 방법을 공유합니다.이 방식은 내가 2003년 사진 커뮤니티(studiosign)에서 사용하고 2022년의 실제 e커머스에서도 적용한 방법입니다.특히 셔플 필터의 값은 아마 국내에서 유일하게 공개하는 것 아닌가 싶습니다.( 대단한 것도 없지만).보통 셔플의 예제는 아주 강할 내용밖에 없어요.통상 백엔드에서 파일이 업로드되면 이벤트에서 트리거를 받고, 그 파일에 대한 후 처리를 하게 됩니다.요즘은 AWS CloudFront와 Lamda를 이용하고 현금 처리를 하는 방식 CDN을 이용하는 경우가 많지만 뒷감당을 적용하면 우선 사진의 품질을 높이고 파일 크기를 적정하게 유지하는 것으로 이 방식을 많이 하게 될 것입니다.파이썬에서는, 화상의 읽는 법을 쉽게 제공되고 있습니다.opencv를 쓰지 않아도 됩니다.

from PIL import Image, Image Filterimport io #Byte를 변환하는 것이 아니라 직접 파일로 읽는 경우 org_image = Image.open (‘unsplash.jpg’) #bytearray로 직접 읽을 때 (DB등) #Image.open (io.BytesIO(org_raw)) org_image

unplash.jpg 파일

이미지 리사이즈 Python에 Pillow 라이브러리를 이용하면 이미지 리사이즈를 하는 방법은 걱정하지 않아도 됩니다. 단, 이미지 사이즈 중 width가 더 큰지 height가 더 큰지는 계산해야 합니다.

width, height=org_img.size baselength=400#resized_height(길이)의 경우 width>height:hpercent=(길이/길이(폭)resized_height=int(높이)*langesize(hpercent)resized_image=org_image.hlanges(길이, 사이즈), Image.hymage.BILINEAR)#로가지미 basel(길이 기준 길이)else:hpercent=(길이/폭(높이)resized_width=int(폭(폭)*langes(hpercent)resized_image=org_image.hlanges(폭 기준장), Image.바이 리니어)

width, height = org_img.size baselength = 400 # resized_height (長さ) 의 경우, width > height: hpercent = (길이/길이(폭)) resized_height = int(高さ)* langesize(hpercent)) resized_image= org_image.hlanges(長さ、サイズ)、Image。hymage。BILINEAR)# 로가지 미 basel (기장,기준길이) else: hpercent = (길이/폭(높이)) resized_width = = int((幅(幅))* langes(hpercent)) resized_image = org_image.hlanges(폭,기준장)), Image.바이리니어)

콘볼루션(Convolution) 간단히 말해 이미지 픽셀에 대해 어떤 지정한 3×3 매트릭스를 이미지(2차원) 데이터를 프로젝션하여 새로운 이미지(새로운 2차원 데이터)를 만들어 내는 것입니다. 딥러닝 CNN에도 그대로 적용되는 개념입니다.

그러면 이미지가 줄어드나요? 네, 이미지 후처리로 인해 데이터 특성이 축소되는데 이를 방지하기 위해 커널을 처리할 때 input image 데이터 주변에 0으로 패딩을 둘러싸서 크기가 작아지지 않도록 할 수 있습니다. 이것은 개념적인 이야기이고, 요즘은 코드에 option 값을 하나만 지정하면 그것을 자체적으로 구현해주기 때문에 걱정하지 않으셔도 됩니다 통상, 이하와 같이 코드가 정해져 있습니다.

Sharpen 커널

Gaussian Blur 커널

이미지 Sharpen 처리 seen sharpen kernel seen은 제가 사진 활동을 할 때 사용하는 가명입니다. 앞으로는 회사나 개인마다 내가 사용하고자 하는 커널을 하나 정도는 가지고 있어야 하는데, 나는 Sharpen 커널은 아래에서 정의해서 사용할 것입니다. 위에서 정의한 주변주는 1/2로 줄이고 중앙은 5에서 3으로 변경하였습니다.kernel = (0, -0.5, 0, -0.5, 3, -0.5, 0) image_filter = ImageFilter 커널 (3.3), 커널, 1.0) sharpened_image = resized_image. 필터(image_filter)kernel = (0, -0.5, 0, -0.5, 3, -0.5, 0) image_filter = ImageFilter 커널 (3.3), 커널, 1.0) sharpened_image = resized_image. 필터(image_filter)차이를 비교하기 위해 원본 이미지에 적용해 보겠습니다. 아래를 비교해 보면 확실한 차이를 느낄 수 있을 것입니다.샤프커넬 보기일반적인 sharpen kernel 입니다일반적인 셔플 필터는 너무 강해서 사용하기 어렵습니다. 내가 공개한 커널을 이용하면 서비스에서 적용해서 사용해도 부담이 없는 수준입니다. 이미지 흑백 변환 이미지를 흑백으로 변환하는 방법은 대개 Pillow의 .convert(‘L’)를 통해 처리하도록 안내하는 자료가 많습니다. 간단하게 변경하시려면 그 방법을 이용하셔도 됩니다.org_image.convert(‘L’)org_image.convert(‘L’)하지만 제가 사용하고 있는 흑백 변환 방법입니다. 명단(밝은 영역)은 10%정도 줄이고 암부(어두운 영역)는 5%정도 올리도록 후처리를 합니다.def bw_image(source_image):#복제된이미지로 작업하기위해 copy()사용image=source_image.copy(). convert(‘L’)pixels=image.load()for i in range(image.width):for j in range(image.height):pixel_value=pixels[i, j]#명단의 경우 픽셀 값을 10% 줄이고 if pixel_value>128:pixel_value=int(pixel_value*0.90)#암부의 경우 픽셀 값을 5%증가시키는 else:pixel_value=int(min(pixel_value*1.05,255)pixels[i, j]=pixel_value return image위 사진과 비교하면 큰 차이가 있을 겁니다.다시 seen 셔플을 적용하면 아래와 같습니다.이미지 세피아(Sepia) 변환 세피아 작업은 약간 다른 RGB 채널에 대해 직접 접근하여 처리해야 합니다. IamgeOps반에서 처리할 수 있는데, 아래의 코드로 조정하는 것이라고 인식하는 것만으로 필요할 때 자신의 코드를 그대로 복사해서 사용하면 됩니다PIL임포트 이미지에서 ImageOpsdef apply_copyia(source_image):image=soruce_image.copy(폭), height=image.load(높이)범위 내의 px의 경우:r, g, b=pixels[pix, py]tr=int(0.393*r+0.769*g+0.php*b)tg+0.hig(0.phpx*r+0.h)tg(높이*r+.686*g+0.168*b)tb=int(0.272*r+0.534*g+0.165*b)#RGB값이 유효한 범위 내임을 확인합니다.[0,255]tr>255의 경우:tr=255의 경우:tg>255의 경우:tg=255의 경우:tb=255픽셀[tb, py]=(tr, py, tb)를 갚겠습니다PIL 임포트 이미지부터 , ImageOpsdefapply_copyia(source_image) : image = soruce_image.copy(폭), height = image.load(높이) 의 범위 내 px 의 경우: r, g, b = = pixels [pix, py] tr = int(0.393 * r + 0.769 * g + 0.php * b) tg + 0.hig (0.phpx * r + 0.h) tg (높이 * * r +.686 * g + 0.168 * b) tb = int(0.272 * r + 0.534 * g + 0.165 * b) # RGB 값이 유효한 범위 내인지 확인합니다.[0、 255] tr > 255인 경우: tr = 255 경우 : tg > 255의 경우 : tg = 255 의 경우: tb = 255 픽셀 [tb, py] = (tr,py,tb)를 반환합니다뭔가 너무 센 것 같은데요? 그럼 흑백 변환 코드를 참조하여 명암을 조정하는 코드를 작성하여 추가합니다. 흑백과 달리 이번에는 3개의 RGB 채널에 대해 명암 조정을 모두 적용해야 합니다.def apply_adjustment(image):pixels=image.load()width, height=image.size for range(height):px in r, g, b=pixels[pixes, py]avg=(r+g+b)//3(avg>128:r=int(r*0.9)g=int(g*0)/0의 경우).9)b=int(b*0.9)else:r=int(min(r*1.05, 255)g=int(min(g*1.05, 255)b=int(min(b*1.05, 255)pixels[module, py]=(r, g, b)returname사용하시는 코드입니다apply_adjustment( apply_contextia(context_image))apply_adjustment( apply_contextia(context_image))세피아의 경우, 확실히 명부(밝은 영역)가 조정되므로, 확실히 보다 부드러움이 강해집니다. 개인적으로 도움이 되었으면 좋겠습니다 단추와 제 이름만 기억해주시면 됩니다 감사합니다。

error: Content is protected !!