2014-10-29 7 views
0

그림을 "노이즈 제거"하는 프로그램을 작성하려고합니다. 난 국경이 아닌 픽셀만을 잡아서 값을 설정하기 위해 경계 픽셀을 사용하려고하지만 내 알고리즘이 의도 한 픽셀을 잡지 못하는 것처럼 보입니다. 결과적으로 이미지가 엉망이됩니다. 제가 정확하게 n = 길이를 이해한다면, m = 높이 (예 : 행). 저는 numpy를 사용하여 3d 표현을 할 수 있다는 것을 알고 있습니다. 그러나 그것은 제가하려고하는 것이 아닙니다. 누구든지 내가 뭘 잘못하고 있는지 알 수 있니? (분명하지만, 그것이 2D-표현을 위해 작성 (그리고 C의 것))Python을 사용한 Denoise 이미지 알고리즘

from PIL import Image 
def DenoiseImage(inputIm, factor, iters): 

data = list(inputIm.getdata()) 
n, m = inputIm.size 
data2 = data 

for y in range (0, iters): 

    #operate on pixels that aren't part of the top or bottom row 
    for x in range (n, ((m-1)*n)-1): 

     #makes sure x operated on isn't part of the left or right border 
     if (x-1)%n != 0 and x%n != 0: 
      #denoise pixel 
      data[x] = data2[x] +factor*(data2[x-1]+data2[x+1]-4*data[x]+data2[x-n]+data2[x+n]) 

    temp = data2 
    data2 = data 
    data = temp 

if iters%2==0: 
    return data2 
else: 
    return data 

이것은 내가 사용하려고 해요 알고리즘은 다음과 같습니다 : 여기에 코드입니다 http://pastebin.com/teEeUgFj

편집 : 얼마쯤 알고리즘 뒤에 생각의 그래픽 표현은, 내 모든 예술적인 재능을 가져 오는 것은 부담합니다 : 마음 m하십시오

derp

는 아래로 길이 사진 m 너무 것 be = 4가 아닌 301.

답변

1

가능한 원인은 data2 = data 일 수 있습니다. 데이터를 변경하는 프로세스는 동일한 메모리 블록을 공유한다는 것을 의미하는 동일한 데이터 2 변경을 발생시킵니다. 이것은 목록과 같은 변경 가능한 클래스를 처리 할 때 파이썬에서 고유하게 발생합니다. 당신은

import copy data2 = copy.copy(data)

사용할 수 있습니다 또는 당신이 코드를 단순화하기 위해 scipy.signal.convolve2d를 사용하고 훨씬 더 효율적입니다 제안한다. 확인 here

+0

정말 고맙습니다. 이제 나는 90 % 블랙 박스가 아닌 출력 그림을 얻습니다. 그래도 여전히 문제가 있습니다. 1 회 반복하면 출력 그림이 다소 다를 수 있지만 (예 : 10 회) 많은 반복을 수행하면 출력 그림은 단지 "눈보라"입니다 ". 나는 data2 = data와 temp use를 copy로 대체했다. 아이디어? 핵심 denoise 함수가 제대로 작동하지 않는 것처럼 보일 수 있지만, 내가 볼 수있는 한, 나는 링크를 게시 한 알고리즘에서 그것을 직접 복사했습니다. – user2875994

+0

또한, convoke2d는 입력으로 2d 배열을 사용하는 반면, 가져온 목록은 1 차원 목록입니다. – user2875994

+0

Ooop, 신경 쓰지 마세요, 저는 방금 너무 높은 요소 값 (1)을 가졌습니다. 0.1로 시도해 볼 때 작동하는 출력 그림이 있습니다. 그래서 유일한 관련 질문은 소집 된 질문입니다. – user2875994