Python OpenCV3で疑似カラー処理(モノクロ画像からカラー画像へ?)

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

疑似カラー処理とは、画像内のRGB値の階調を変換する処理のこと。
やり方などもあっているかわからないため、ご指導いただければ幸いです。

前提

ディレクトリ構成などはこことかこことか。

&nbsp

元画像

ガンマ変換などと比較しやすいために、同じこの画像(sora2.jpg)を使う。
以前の例だとsource/imageディレクトリ配下に設置する。

sora

 

ルックアップテーブル

ルックアップテーブルは、RGBそれぞれに関数を作成してみる。
以下のような関数を3つ作成した。

def get_lookuptable_r(x):
    """疑似カラー処理のR成分用"""
    
    if x < 128:
        return 0
    elif x < 192:
        return 4 * x - 512
    else:
        return 256
    
def get_lookuptable_g(x):
    """疑似カラー処理のG成分用"""
    
    if x < 64:
        return 4 * x 
    elif x < 192:
        return 256
    else:
        return -4 * x + 1024

def get_lookuptable_b(x):
    """疑似カラー処理のB成分用"""
    
    if x < 64:
        return 256
    elif x < 128:
        return -4 * x + 512
    else:
        return 0

 
赤がR用、緑がG用、青がB用。
 

iPythonのnotebooknotebookを使ったグラフの描画を利用して関数を描画した。

pcp_graph

 

上で作った3つの関数は描画用に改造した。

 

%matplotlib inline
import numpy as np
from matplotlib import pyplot

def get_lookuptable_r(ary):
    """疑似カラー処理のR成分用"""
    answer = []
    
    for x in ary:
        
        if x < 128:
            answer.append(0)
        elif x < 192:
            answer.append( 4 * x - 512)
        else:
            answer.append( 256 )
        
    return answer

def get_lookuptable_g(ary):
    """疑似カラー処理のG成分用"""

    
    answer = []
    
    for x in ary:
        
        if x < 64:
            answer.append( 4 * x )
        elif x < 192:
            answer.append( 256 )
        else:
            answer.append( -4 * x + 1024 )

    return answer


def get_lookuptable_b(ary):
    """疑似カラー処理のB成分用"""

    
    answer = []
    
    for x in ary:
        
        if x < 64:
            answer.append( 256 )
        elif x < 128:
            answer.append( -4 * x + 512 )
        else:
            answer.append( 0 )

    return answer
            
            
x = np.arange(0, 256)

# B用表示
y = get_lookuptable_b(x)
pyplot.plot(x, y)

# G用表示
y = get_lookuptable_g(x)
pyplot.plot(x, y)

# R用表示
y = get_lookuptable_r(x)
pyplot.plot(x, y)

 

擬似カラー処理

sourceディレクトリ配下にpseudo_color_processing.pyを作成する。
RGBそれぞれのルックアップテーブルを作成し、OpenCV3のLUTメソッドの引数でルックアップテーブルを使って変換したものをマージする。

# -*- coding: utf-8 -*-

import cv2
import numpy as np

def get_lookuptable_r(x):
    """疑似カラー処理のR成分用"""
    
    if x < 128:
        return 0
    elif x < 192:
        return 4 * x - 512
    else:
        return 256
    
def get_lookuptable_g(x):
    """疑似カラー処理のG成分用"""
    
    if x < 64:
        return 4 * x 
    elif x < 192:
        return 256
    else:
        return -4 * x + 1024

def get_lookuptable_b(x):
    """疑似カラー処理のB成分用"""
    
    if x < 64:
        return 256
    elif x < 128:
        return -4 * x + 512
    else:
        return 0 



if __name__ == '__main__':

    # ルックアップテーブルの生成
    """
    array([[0],
           [0],
           [0],
           [0],
           [0],
           [0],
           [0],
        ・・・・・・・・
           [0], dtype='uint8')
    のようなリストが生成される。
    """
    look_up_table_r = np.ones((256, 1), dtype = 'uint8' ) * 0
    look_up_table_g = np.ones((256, 1), dtype = 'uint8' ) * 0
    look_up_table_b = np.ones((256, 1), dtype = 'uint8' ) * 0

    for i in range(256):

        各RGBごとのルックアップテーブルを作成
        look_up_table_r[i][0] = get_lookuptable_r(i)
        look_up_table_g[i][0] = get_lookuptable_g(i)
        look_up_table_b[i][0] = get_lookuptable_b(i)


    # 画像の読み込み
    img_src = cv2.imread("./image/sora2.jpg", 1)
    # 複数色のチャンネルを分割して配列で取得
    # img_bgr[0] に青, img_bgr[1]に緑,img_bgr[2]に赤が入る。

    # 読み込んだ画像のグレースケール化
    img_gry = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)

    # 擬似カラー化
    img_pcp_r = cv2.LUT(img_gry, look_up_table_r)
    img_pcp_g = cv2.LUT(img_gry, look_up_table_g)
    img_pcp_b = cv2.LUT(img_gry, look_up_table_b)

    # 各擬似カラー化した画像をマージ
    img_mrg = cv2.merge((img_pcp_b,img_pcp_g,img_pcp_r))    

    # 表示
    cv2.imshow("Show Pseudo Color Processing Image", img_mrg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

実行してみる。

python pseudo_color_processing.py

スクリーンショット 2015-06-23 18.28.16

何この魔界。
やり方間違ってる気がするなぁ。。。

 

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です