2017-11-19 2 views
0
from PIL import Image 
fp="C:\\lena.jpg" 
img=Image.open(fp) 
w,h=img.size 
pixels=img.load() 

imgsharp=Image.new(img.mode,img.size,color=0) 
sharp=[0,-1,0,-1,8,-1,0,-1,0] 

for i in range(w): 
    for j in range(h): 

     for k in range(3): 
       for m in range(3): 
        l=pixels[i-k+1,j-m+1]*sharp[i] 

     if l>255: 
      l=255 
     elif l<0: 
      l=0 
     imgsharp.putpixel((i,j),l) 

imgsharp.show() 

그레이 스케일 이미지에 3x3 마스크 크기의 고역 (선명도) 필터를 적용하고 싶습니다. 하지만 오류가 나타납니다. 실수를 수정하고 오류를 수정 한 후 어떻게하면이 코드에서 이미지를 선명하게 할 수 있습니까?python : 이미지 선명하게 적용/오류 적용

오류 :

Traceback (most recent call last): 
File "C:\sharp.py", line 16, in <module> 
l=pixels[i-k+1,j-m+1]*sharp[i] 
IndexError: image index out of range 

당신이 이미지의 경계 처리되지 않기 때문에 당신이 언급 한 특정 오류가 당신

답변

0

감사드립니다. 해결 방법은 pad the image 또는 너비와 높이 제한을 처리하는 것입니다. 예 : i-k+1j-m+1을 각각 max(0, min(w, i-k+1))max(0, min(h, j-m+1)))으로 바꿉니다.

  • 액세스하는 필터의 요소는 당신이 sharp[i]을 쓴 곳 ... 당신은 아마 sharp[3*m+k]을 의미하는 것은 옳지 않다 :

    은 코드와 다른 문제가 있습니다.

  • 컬러 또는 회색조 이미지를 사용하고 있습니까? 컬러 이미지의 경우 l은 3 차원을 가지며 단일 숫자 (0 또는 255)와 직접 비교할 수 없습니다.
  • 또한 l 값과 putpixel 호출의 클리핑은 관심있는 루프 안에 있어야합니다.
  • 커널이 약간 이상해 보입니다. 8이 5가 될 예정입니까? 아니면 9와 0이 -1이 될까요? kernelsthis example을보세요.
  • 여러 개의 중첩 루프를 사용한이 구현은 그리 효율적이지 않습니다.

다음 해결책을 권장합니다. 이미지를 선명하게 원하고 그게 다야 경우

, 당신은 PIL.Image.filter을 사용할 수 있습니다 : 당신이 커널을 지정하려는 경우

from PIL import Image, ImageFilter 


img = Image.open('lena.png') 
img_sharp = img.filter(ImageFilter.SHARPEN) 
img_sharp.show() 

에서, scipy와 다음 해보십시오. convolve documentation을 살펴보십시오.

from PIL import Image 

from scipy import ndimage, misc 
import numpy as np 


img = misc.imread('lena.png').astype(np.float) # read as float 
kernel = np.array([0, -1, 0, -1, 5, -1, 0, -1, 0]).reshape((3, 3, 1)) 

# here we do the convolution with the kernel 
imgsharp = ndimage.convolve(img, kernel, mode='nearest') 
# then we clip (0 to 255) and convert to unsigned int 
imgsharp = np.clip(imgsharp, 0, 255).astype(np.uint8) 

Image.fromarray(imgsharp).show() # display 

또 다른 접근법은 OpenCV를 사용하는 것입니다. this article을보십시오. 많은 구현 세부 사항에 대해 명확하게 설명합니다.