【Python・画像処理】エンボス加工を行う

Python

エンボス加工とは

エンボス(Emboss)とは板金やなどに文字や絵柄などを浮き彫りにする加工である。

出典元:Wikipedia https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%9C%E3%82%B9

つまり、こんな感じのやつです。

エンボス加工後(Wikipedia)

変換方法

エンボス加工は、元の画像をf_1、ネガポジ反転して数ピクセル平行移動させた画像をf_2とした時に、以下の式で変換することができます。


$$ 変換画素 = f_1 + f_2 – 128 $$

イメージで表すとこんな感じです。

実際にエンボス加工を行う

今回はこの画像に対してエンボス加工を行っていきます。

ソースコード

import numpy as np      # 行列の計算用
from PIL import Image   # 画像の読み込み用

###############################
# エンボス加工を行う関数
#
# @param int m_x=1 x方向の移動量
# @param int m_y=1 y方向の移動量
###############################
def embossing(m_x=1, m_y=1):

    # 1未満の場合抜ける
    if m_x <= 0 or m_y <= 0:
        print("整数値で0より大きい値にしてください。")
        return

    # 元画像を読み込む
    image = Image.open('emboss.jpg')
    # 読み込んだ画像をグレースケール 配列に変換する
    image_array = np.array(image.convert("L"))
    
    ##################
    # ネガポジ反転させる
    ##################
    negaposi_array = np.array(image.convert("L"))
    # 画像の縦のループ
    for row_index in range(len(negaposi_array)-1, -1, -1):
        # 横一列にかけるループ
        for column_index in range(len(negaposi_array[row_index])-1, -1, -1):
            # ネガポジ反転
            pixel = negaposi_array[row_index][column_index]
            negaposi_array[row_index][column_index] = 255 - pixel

    #########################
    # ネガポジ配列を平行移動する
    #########################
    # 画像の縦のループ
    for row_index in range(len(negaposi_array)-1, -1, -1):
        # 横一列にかけるループ
        for column_index in range(len(negaposi_array[row_index])-1, -1, -1):
            # 平行移動させる
            pixel = negaposi_array[row_index-m_y][column_index-m_x]
            negaposi_array[row_index][column_index] = pixel

    #################
    # エンボス加工する
    #################
    # 画像の縦のループ
    for row_index in range(len(image_array)):
        # 横一列にかけるループ
        for column_index in range(len(image_array[row_index])):
            # ネガポジに変換する
            f_1 = image_array[row_index][column_index]
            f_2 = negaposi_array[row_index][column_index]
            # f_1 + f_2 - 128
            image_array[row_index][column_index] = f_1 + f_2 - 128

    # エンボス加工をした配列を画像として保存する
    emboss_img = Image.fromarray(np.uint8(image_array))
    # 加工後の画像を表示する
    emboss_img.show()

# 実際にエンボス加工を行う
embossing(m_x=1, m_y=1)
embossing(m_x=2, m_y=2)
embossing(m_x=3, m_y=3)

実行結果

m_x=1, m_y=1の時
m_x=2, m_y=2の時
m_x=3, m_y=3の時

まとめ

平行移動させる値を大きくすることで、エッジがくっきり出てくることがわかりました!!

コメント

タイトルとURLをコピーしました