LoginSignup
2
2

More than 5 years have passed since last update.

【画像処理】ノイズ除去をやってみた♪~ゆらぎによる歪み画像生成~

Last updated at Posted at 2019-01-06

昨夜に引き続き、OpenCVを利用して画像処理し、ノイズ除去することを考える。

そもそもやりたいこと

・顕微鏡や望遠鏡画像は、機材の振動やピンボケ、そして大気の揺らぎやその他外部要因でゆらぎやノイズが乗っている。そこで、それを除去して信号本来の絵や動画を得たいと思う

たとえば、天体観測におけるデジタル画像には、参考で議論されているようなゆらぎが乗っている。
簡単に理解するために、参考から引用すると、以下のようなイメージである。
Convolution_Illustrated_eng.png
ここでは、このImageが与えれたとき、そもそもの信号であるObjectをみちびきだすことを考える。
ここで、「PSF(Point spread function)であり、一般的にはインパルス応答である。」そうです。今回はこの辺りの理論についてはこれ以上深入りしないこととする。
【参考】
点拡がり関数

今回やったこと

①OpenCVを利用してObjectをデフォルメする
②Registaxのインストールと使い方
③デフォルメされた画像の復元

①OpenCVを利用してObjectをデフォルメする

参考の様に、DeepLearningの学習データ作成のためのデフォルメを利用する。
【参考】
deeplearning_tool/increase_picture.py

今回は、以下のようにアプリにより、上記のPSF的な変更を実施した。
なお、全体のコードは以下のとおり
OpenCV/trans_img.py

if __name__ == '__main__':
    # プログラムが存在するディレクトリの代入
    current_dir = os.getcwd()
    print(current_dir)
    # 画像が存在するディレクトリの代入

    image="hosi.jpg"    
        # 画像の読み込み
    img_src = cv2.imread(image)
    cv2.imshow('org1',img_src)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    trans_img = []
    for i in range(10,100,5):
        for j in range(10,100,5):
            # 平滑化用
            average_square = (i,j)  #(10,10)
            # x軸方向の標準偏差
            sigma_x = 0
            sigma_y = 0
            # 平滑化      
            trans_img.append(cv2.blur(img_src, average_square,(sigma_x,sigma_y)))      

    # 反転
    flip_img = []
    for img in trans_img:
        flip_img.append(cv2.flip(img, 1))
    #trans_img.extend(flip_img)

    # ヒストグラム均一化
    hst_img = []
    for img in trans_img:
        hst_img.append(equalizeHistRGB(img))
    #trans_img.extend(hst_img)
    #trans_img.append(equalizeHistRGB(img_src))

    # ノイズ付加
    gaus_img = []
    for img in trans_img:
        gaus_img.append(addGaussianNoise(img))
    spn_img = []
    for img in trans_img:
        gaus_img.append(addSaltPepperNoise(img))

    trans_img.extend(flip_img)    
    trans_img.extend(hst_img)
    trans_img.extend(gaus_img) 
    trans_img.extend(spn_img)       

    # 保存
    if not os.path.exists("trans_images2"):
        os.mkdir("trans_images2")

    for i, img in enumerate(trans_img):
        # 比較用
        cv2.imwrite("trans_images2/" + str(i) + ".jpg" ,img) 

鏡面反転が同時に得られることはあまりなさそうだが、それ自身は普通に起こることなので、生成してみた。
代表的なものは、以下のとおりである。
オリジナル
hosi.jpg
ぼやけ 縦
53.jpg
ぼやけ 横
308.jpg
真ん中
323.jpg
鏡面反転
525.jpg
saltPepper
1598.jpg

動画にすると以下のとおり

【データ処理】OpenCVを利用して画像をデフォルメしてみた♪

※画像をクリックするとYouTube動画につながります

②Registaxのインストールと使い方

上記のとおり、いろいろな外乱の乗ったバリエーション画像が作成できた。
しかし、ここからノイズ除去する最適な方法はあるのだろうか。
ということで、今回は天体観測で使われているRegistaxというソフトでノイズ除去してみることとする。
【参考】
RegiStax6 Free image processing software

インストール

まず、
「RegiStax 6 Available
The initial release of RegiStax 6 is available for download. You can use this link to directly download the installable file.」
と書かれているとこのthisをクリックすると最初のオリジナルがダウンロードし実行するとインストールできる。
そして、上の
「Download Release 6.1.0.8 (1.6 Mb)」
からUpdateをダウンロードして実行するとインストールできる。
実行イメージは以下の通り、
registax.jpg

【参考】
Registax 6の使い方@Starry Urban Sky

使い方

詳細は、参考を見ていただきたいが、ここでは簡単に実行したところ、少なくとも良い結果を得たのでそれを記述する。
1.ファイルを選択
selectタブでファイル選択する。選択できるファイルは画像ならbmp,jpg,pngなど、そして動画を読み込んで、1フレームごと選択して処理できる。
ただし、対応している拡張子はavi, mpg, mpegである。mp4は対応していなかった。
2.Alignを押して、Set Allignpointsを押す
 すると、画像に赤い点(特徴点を抽出する)
tokutyo.jpg
3.Allignを押すと画像がAlignされ,生成された画像が保存できるようになる
これでWaveletを利用して積算ができているようだ。
waveletについてもここでは言及しないが、ここをきちんと把握することが、信号処理のデータ処理における肝であるようだ。
【参考】
ウェーブレット@wikipedia
Pythonで連続ウェーブレット変換(scipy, mlpy, swan)
4.あとは生成されたbmp画像をSaveする

③デフォルメされた画像の復元

上記生成したデフォルメされた画像を集めて以下のアプリでavi動画にした。
変更箇所はコーデックとファイル名(avi)のみである。
【参考】
OpenCVで遊んでみた♬
全体のコードは以下に置いた
OpenCV/combined_noisy.py

def main():
    OUT_FILE_NAME = "combined_video"
    FRAME_RATE=30
    dst = cv2.imread('0.jpg')
    rows,cols,channels = dst.shape
    print(rows,cols,channels)
    timer = cv2.getTickCount()
    out = cv2.VideoWriter(OUT_FILE_NAME+str(int(timer))+".avi", \
              cv_fourcc('X', 'V', 'I', 'D'), \
              FRAME_RATE, \
              (cols, rows), \
              True)
    for i in range(1,1000):
        cv2.imshow('combined',dst)
        cv2.destroyAllWindows()
        # 読み込んだフレームを書き込み
        out.write(dst)
        # 次のフレームを読み込み
        dst = cv2.imread('{}.jpg'.format(i))

そして結果は以下のようになりました。
※bmpを貼れないので、jpgに変更しています。
それにしても、なんという美しさ。
・もともとの画像と比較しても解像度が上がっているように見える。
combined_video5970938022988.jpg
・猫画像は以下のとおり
猫画像は昨夜の積算で得られた結果とほぼ同様ですが、ちょっとだけこちらの方がよさそうです。
combined_video5980267495568.jpg

まとめ

・OpenCVを利用してObject+PSFのいろいろな画像を生成した
・Registaxを使って、Objectを復元してみた

・理論的な解説とそれに基づく復元アプリを作成したい
・DLを利用するとどこまで復元できるか試したい
・天体観測に応用したい

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2