2016-09-11 26 views
2

ここで初心者です。 イメージを持っています イメージにノイズを追加しました。ノイズ(またはそのようなもの)でイメージをクリアする必要があります。 unnoising algorythmは次である:画像からのノイズの除去Python PIL

画素の輝度が局所近傍の平均輝度 より大きい場合、画素の輝度が周囲の平均輝度に置き換え あります。

from PIL import Image 
import random 
from multiprocessing import Pool 
from multiprocessing.dummy import Pool as ThreadPool 

img=Image.open('pic.bmp') 
print(img.size) 
randomenter=int(input('Enter numpix: ')) 
for numpix in range(0, randomenter): 
    x=random.randint(0,int(img.size[0]-1)) 
    y=random.randint(0,int(img.size[1]-1)) 
    r=random.randint(0,255) 
    g=random.randint(0,255) 
    b=random.randint(0,255) 
    img.putpixel((x,y),(r,g,b)) 
img.show() 
img.save("noise.bmp", "BMP") 

img2=Image.open("noise.bmp") 
w, h = img2.size 

pix=img2.copy() 
for x in range(0,w-1): 
    if x-1>0 and x<w: 
     for y in range(0,h-1): 
      if y-1>0 and y<h: 
       local1=(0.3 * pix.getpixel((x-1,y-1))[0]) + (0.59 * pix.getpixel((x-1,y-1))[1]) + (0.11 * pix.getpixel((x-1,y-1))[2]) 
       local2=(0.3 * pix.getpixel((x-1,y))[0]) + (0.59 * pix.getpixel((x-1,y))[1]) + (0.11 * pix.getpixel((x-1,y))[2]) 
       local3=(0.3 * pix.getpixel((x-1,y+1))[0]) + (0.59 * pix.getpixel((x-1,y+1))[1]) + (0.11 * pix.getpixel((x-1,y+1))[2]) 
       local4=(0.3 * pix.getpixel((x,y-1))[0]) + (0.59 * pix.getpixel((x,y-1))[1]) + (0.11 * pix.getpixel((x,y-1))[2]) 
       LOCAL5=(0.3 * pix.getpixel((x,y))[0]) + (0.59 * pix.getpixel((x,y))[1]) + (0.11 * pix.getpixel((x,y))[2]) 
       local6=(0.3 * pix.getpixel((x,y+1))[0]) + (0.59 * pix.getpixel((x,y+1))[1]) + (0.11 * pix.getpixel((x,y+1))[2]) 
       local7=(0.3 * pix.getpixel((x+1,y-1))[0]) + (0.59 * pix.getpixel((x+1,y-1))[1]) + (0.11 * pix.getpixel((x+1,y-1))[2]) 
       local8=(0.3 * pix.getpixel((x+1,y))[0]) + (0.59 * pix.getpixel((x+1,y))[1]) + (0.11 * pix.getpixel((x+1,y))[2]) 
       local9=(0.3 * pix.getpixel((x+1,y+1))[0]) + (0.59 * pix.getpixel((x+1,y+1))[1]) + (0.11 * pix.getpixel((x+1,y+1))[2]) 
       localall=(local1+local2+local3+local4+local6+local7+local8+local9)/8 
       if LOCAL5<localall: 
        img2.putpixel((x,y),(int(pix.getpixel((x,y))[0]*localall/LOCAL5),int(pix.getpixel((x,y))[1]*localall/LOCAL5),int(pix.getpixel((x,y))[2]*localall/LOCAL5))) 
img2.show() 

輝度変化の瞬間に問題があります。 オフィシャルドックには、このケースに関する詳細情報はありません。 解決策はありますか?

+0

問題がありますか?何が問題ですか? – Selcuk

+0

@Selcuk私は最後のサイクルでピクセルの明るさを変更する方法を知らない – lwwwr

答えて

1

まず、画像のコピーを作成して、データをimgCopy = img.copy()に書き込む必要があります。 それ以外の場合、ノイズ補正されたピクセルはまだ触れていないピクセルの修正に影響します。あなたのelse文で あなたは単にあなたが計算された平均明るさでそれを掛け、その後、あなたの中間のピクセルを正規化する必要があります。

imgCopy[i, j] = imgCopy[i, j] * local/nuzh 
+0

hmm。ノイズのある画像を別のファイルに保存して開きました。私はあなたのアルゴリズムを試しましたが、ローカルピクセルも編集されました。私は間違って何をしていますか? – lwwwr

+1

@lwwwr img2.load()を呼び出してpix画像を設定しています。つまり、img2とpixはメモリ内の同じデータを参照するため、img2を変更するとpixも変更されます。 'pix = img2.load()'行を 'pix = img2.copy()'に変更すると、imgとpixはそのデータを共有しません。 –

関連する問題