うさぎでもわかる画像処理 Part02 トーンカーブと画像処理 [Python・MATLABコード付き]
ガンマ補正では、入力画素値 \( x \)、出力画素値 \( y \) に対して\[y = 255 \left( \frac \right)^\]の処理を与えます [4] 指数部分を \( \frac < \gamma >\) とし、\[y = 255 \left( \frac \right)^< \frac >\]と表記することも多いです。というのも、元画像 \( y \) … Continue reading (※ \( \gamma \) は出力装置ごとに最も適した値を設定する)
(1-b) ガンマ変換と明るさの関係実際にガンマ値 \( \gamma \) を変化させながらガンマ補正を行うと、どんな画像が生成できるかを見てみましょう。
- ガンマ値 \( \gamma > 1 \) → 元の画像より暗くなる変換
- ガンマ値 \( \gamma = 1 \) → 元の画像と全く同じ変換(明るさ変化なし)
- ガンマ値 \( \gamma < 1 \) → 元の画像より明るくなる変換
となります [5] ガンマ補正を逆数\[y = 255 \left( \frac \right)^< \frac >\] で定義した場合は、 ガンマ値 \( \gamma > 1 \) → … Continue reading 。
(1-c) 様々なガンマ値とトーンカーブガンマ値を 0.25 ~ 4 まで変化させるとトーンカーブはどのように変化するかを、実際にグラフを描画することで確認してみましょう。
- 紫 → \( \gamma = 0.25 \)
- 青 → \( \gamma = 0.50 \)
- 緑 → \( \gamma = 1.00 \)
- 黄 → \( \gamma = 2.00 \)
- 赤 → \( \gamma = 4.00 \)
入力画像 input_img , およびガンマ値 gamma を引数とすることで、ガンマ変換を行う関数です。
[Python]
import numpy as np def gammaTone(input_img,gamma): output_float = 255 * np.power(input_img / 255, gamma) # 計算結果をいったん実数型(float)で保持 return output_float.astype(np.uint8)[MATLAB]
function output_img = gammaTone(input_img,gamma) output_double = 255 * power(double(input_img) / 255,gamma); % 計算結果をいったん実数型(double)で保持 output_img = uint8(output_double); end ガンマ補正まとめ (2) S字トーンカーブ変換数式でS字カーブを描くためには\[y = \frac \left\< 1 - \cos \left( \frac x \right) \right\>\]のように三角関数を使う方法や、ロジスティック方程式\[y = \frac >\]を使う方法があります [6] … Continue reading 。(ただし \( a > 0 \), \( b > 0 \))
[グレースケール画像]
[カラー画像]
ソースコード入力画像 input_img を引数とすることで、S字変換を適用した画像を返す関数のソースコードです。(ロジスティック方程式を利用しました)
[Python]
import numpy as np def sigmoidTone(input_img): output_float = 255 / (1 + np.exp(-0.05 * (input_img - 127.5) ) ) # 計算結果をいったん実数型(float)で保持 return output_float.astype(np.uint8)[MATLAB]
function output_img = sigmoidTone(input_img) output_double = 255 ./ (1 * exp(-0.05 * (double(input_img) - 127.5))); % 計算結果をいったん実数型(double)で保持 output_img = uint8(output_double); end S字カーブ変換まとめ (3) ソラリゼーション変換数式では\[y = \frac \left\< 1 - \cos \left( \frac x \right) \right\>\]のように三角関数を使うことで表現可能です [7] 導出方法ですが、まず \( - \cos x \) の \( 0 \leqq x \leqq 3 \pi \) のグラフに着目します。あとは、このグラフの周期を \( 2 \pi \) から 170 に変換するように … Continue reading 。
[グレースケール画像]
[カラー画像]
ソースコード入力画像 input_img を引数とすることで、ソラリゼーション変換を適用した画像を返す関数のソースコードです。
[Python]
import numpy as np import math def solaTone(input_img): output_float = 127.5 - 255 / 2 * np.cos(3 * math.pi / 255 * input_img) return output_float.astype(np.uint8)[MATLAB]
function output_img = solaTone(input_img) output_double = 127.5 - 255 / 2 * cos(3 * pi / 255 * double(input_img)); % 計算結果をいったん実数型(double)で保持 output_img = uint8(output_double); end ソラリゼーション変換まとめ5. カラー画像特有の画像処理 [Python, MATLABコード付き]
カラー画像では、全体のコントラストを変える画像処理の他にも、 色を調整する という画像処理のテクニックがあります。
具体的には、R, G, Bのトーンカーブに対し、「カラー画像のR, G, Bのうちの一部にトーンカーブを適用し、色のバランスを変える」ということをします。
(1) 特定の色を強調する変換特定の色を強調する場合は、強調したい色のトーンカーブに「折れ線型トーンカーブ \( k > 1 \)」を適用し、残りの成分には何もしません。
[適用するトーンカーブ]
例えば、赤色(R成分)を強める変換をしてみましょう。ここで、R成分に \( k = 1.2 \) の折れ線型トーンカーブを適用します。
[変換結果]
(2) 特定の色を弱める変換[適用するトーンカーブ]
例えば、青色(B成分)を弱める変換をしてみましょう。ここで、B成分に \( k = 0.8 \) の折れ線型トーンカーブを適用します。
[変換結果]
(3) ソースコード入力画像 input_img , 成分の倍率 k 、色 color を引数とすることで、特定の色を強めたり弱めたりすることができる関数を紹介します。
[Python]
import numpy as np import cv2 # color -> (0,1,2,3) が (青,緑,赤,全色[明るさ調整]) に対応 def polygonalTone(input_img,k,color): output_img = 1.0 * input_img # 1.0を掛けることでoutput_imgが255越えしても255でストップする if color == 3: output_img = np.dot(k,input_img) else: output_img[. color] = np.dot(k,input_img[. color]) return output_img ## 使用例 #画像読み込み input_color = cv2.imread(INPUT_PATH) # (1) 赤を強める [R x 1.2] output_color = polygonalTone(input_color,1.2,2) cv2.imwrite(OUTPUT_PATH,output_color) # (2) 青を弱める [B x 0.8] output_color = polygonalTone(input_color,0.8,0) cv2.imwrite(OUTPUT_PATH + "color_sky2.jpg",output_color)[MATLAB]
% color -> (1,2,3,4) が (赤,緑,青,全色[明るさ調整]) に対応 function output_img = polygonalToneColor(input_img,k,color) output_img = input_img; if color == 4 output_img = input_img * k; else output_img(. color) = input_img(. color) * k; end end %% 使用例 % カラー画像読み込み input_color = imread(INPUT_PATH); %% 画像処理ここから % (1) 赤を強める[R x 1.2] output_color = polygonalToneColor(input_color,1.2,1); imwrite(output_color,OUTPUT_PATH); % (2) 青を弱める[B x 0.8] output_color = polygonalToneColor(input_color,0.8,3); imwrite(output_color,OUTPUT_PATH);6. 実際にプログラムを動かして画像処理を体験しよう!
そこで、こちらに「すぐに実行できる」ソースコードと実行方法を書いた説明を用意しました! 実際にプログラムを動かしてみたい方は是非ご覧ください!
7. 練習問題でおさらい!
練習1. トーンカーブのおさらい [基本編]つぎの(1)~(5)の変換が表すトーンカーブを、図1内の [トーンカーブの選択肢] から選び、①~⑥の番号で答えなさい。また、図2の「元画像」に対して(1)~(5)の変換を適用するとどのような画像が生成されるか。最も適切なものを図2内の [変換画像 (猫)] から選び、ア~カの記号で答えなさい。
(1) 画素値を2倍にする変換(2) 画素値を1/2倍にする変換(3) ネガポジ変換(4) 2値化変換(5) ソラリゼーション
[トーンカーブの選択肢]
[画像の選択肢]
練習2. トーンカーブのおさらい [応用編]つぎの①, ②, ③ が示す変換を ①→②→③ の順に適用した。
① 画素値を2倍にする変換② 画素値を1/2倍にする変換③ ネガポジ変換
練習3. カラー画像とトーンカーブつぎのカラー画像に対して、(1)変換1, (2)変換2, (3)変換3 を適用し、新たなカラー画像を作成した。このとき、(1)~(3)の変換で用いたR, G, Bトーンカーブの組み合わせとして正しいものを [R, G, Bトーンカーブの組み合わせ] 内の①~⑧から1つ選び、番号で答えなさい。
[R, G, Bトーンカーブの組み合わせ]
8. 練習問題の答え
解答1. トーンカーブのおさらい [基本編](1) 画素値を2倍にする変換
全体的に明るくなっている写真を選べばOK。画素値を明るくすると、真っ白な画素(画素値255)が出てくるのも (エ) を選ぶ決め手かも。
(2) 画素値を1/2倍にする変換
(3) ネガポジ変換
白黒が完全に入れ替わっている(黒猫が白猫になっている)画像は (ウ) 以外にない。
(4) 2値化変換
(5) ソラリゼーション
[おまけ] 残りものの画像は…?
解答2. トーンカーブのおさらい [応用編][解答]
[変換過程]
元画像 → ①適用後
①適用後 → ②適用後
②適用後 → ③適用後(答え)
解答3. カラー画像とトーンカーブ(1) 正解: ④
(2) 正解: ⑥
(3) 正解: ⑤
9. さいごに
- 画像処理の最も基本的な部分である「画素値を一定のルールに従っていじる」点の説明
- 画素値の変換で使う一定のルールを図でわかりやすく示した「トーンカーブ」について
- 代表的なトーンカーブの例
- カラー画像の画像処理の例
- ガンマ値 \( \gamma > 1 \) → 元の画像より明るくなる変換
- ガンマ値 \( \gamma = 1 \) → 元の画像と全く同じ変換(明るさ変化なし)
- ガンマ値 \( \gamma < 1 \) → 元の画像より暗くなる変換
カテゴリー
各種便利ツール・問い合わせ- 【完全無料】離散数学演習ツール・計算機まとめ
- 【ハッセ図】上界/下界・最大元/最小元・極大元/極小元・上限(最小上界)/下限(最大下界) 判定ツール
- 【ハッセ図】述語論理(∀・∃)真偽判定ツール
- 【離散数学】べき集合 2^A・P(A) 自動計算&全列挙ツール
- 【離散数学】真理値表 自動作成ツール(途中式あり)
- 【離散数学】集合の「∈・⊆」真偽チェッカー(答え合わせ用)
- 【離散数学テスト対策】真理値表の穴埋めガチ演習ツール
- 【離散数学テスト対策】集合の「∈・⊆」ガチ演習! 弱点分析つき○×ドリル
目次
- 1. 最も基本的な画像処理とは?
- (1) グレースケール画像の場合
- (2) カラー画像の場合
- 例1. R, G, B各成分を同じルールに基づいて書き換える場合
- 例2. R, G, B各成分の一部をルールに従って書き換える場合
- (1) なぜトーンカーブを使うのか
- (2) トーンカーブの読み方
- (3) カラー画像の場合のトーンカーブ
- (1) 折れ線型トーンカーブ
- (1-a) 画素値をk倍 (k > 1)
- 例) \( k = 2 \)、つまり画素値を2倍する変換 \( y = 2x \)
- 例) \( k = 1/2 \)、つまり画素値を1/2倍する変換 \( y = \fracx \)
- ソースコード
- 初期値付き折れ線型トーンカーブまとめ
- ソースコード
- 2値化まとめ
- ソースコード
- ガンマ補正(変換)まとめ
- (1) ガンマ補正(変換)
- (1-a) ガンマ変換とは
- (1-b) ガンマ変換と明るさの関係
- (1-c) 様々なガンマ値とトーンカーブ
- (1-d) ソースコード紹介
- ガンマ補正まとめ
- ソースコード
- S字カーブ変換まとめ
- ソースコード
- ソラリゼーション変換まとめ
- (1) 特定の色を強調する変換
- (2) 特定の色を弱める変換
- (3) ソースコード
- 練習1. トーンカーブのおさらい [基本編]
- 練習2. トーンカーブのおさらい [応用編]
- 練習3. カラー画像とトーンカーブ
- 解答1. トーンカーブのおさらい [基本編]
- 解答2. トーンカーブのおさらい [応用編]
- 解答3. カラー画像とトーンカーブ
工業大学生ももやまのうさぎ塾 (Momousagi Academy)
コンピュータグラフィックス コンピュータビジョン- 1. 最も基本的な画像処理とは?
- (1) グレースケール画像の場合
- (2) カラー画像の場合
- 例1. R, G, B各成分を同じルールに基づいて書き換える場合
- 例2. R, G, B各成分の一部をルールに従って書き換える場合
- (1) なぜトーンカーブを使うのか
- (2) トーンカーブの読み方
- (3) カラー画像の場合のトーンカーブ
- (1) 折れ線型トーンカーブ
- (1-a) 画素値をk倍 (k > 1)
- 例) \( k = 2 \)、つまり画素値を2倍する変換 \( y = 2x \)
- 例) \( k = 1/2 \)、つまり画素値を1/2倍する変換 \( y = \fracx \)
- ソースコード
- 初期値付き折れ線型トーンカーブまとめ
- ソースコード
- 2値化まとめ
- ソースコード
- ガンマ補正(変換)まとめ
- (1) ガンマ補正(変換)
- (1-a) ガンマ変換とは
- (1-b) ガンマ変換と明るさの関係
- (1-c) 様々なガンマ値とトーンカーブ
- (1-d) ソースコード紹介
- ガンマ補正まとめ
- ソースコード
- S字カーブ変換まとめ
- ソースコード
- ソラリゼーション変換まとめ
- (1) 特定の色を強調する変換
- (2) 特定の色を弱める変換
- (3) ソースコード
- 練習1. トーンカーブのおさらい [基本編]
- 練習2. トーンカーブのおさらい [応用編]
- 練習3. カラー画像とトーンカーブ
- 解答1. トーンカーブのおさらい [基本編]
- 解答2. トーンカーブのおさらい [応用編]
- 解答3. カラー画像とトーンカーブ
- (1-a) 画素値をk倍 (k > 1)
- (1-a) 画素値をk倍 (k > 1)