RGB値の補正方法を教えてください

RGB値の補正方法を教えていただきたいです。
I = imread("a.jpg");
imshow(I)
R = double(I(:,:,1));
G = double(I(:,:,2));
B = double(I(:,:,3));
その後、
hoseiR = 2*R
hoseiG = 3*G
hosieiB = 4*B
のようにイメージの各ピクセルごとのRGB値を上記の式を用いて色の変換を行いたいです。
その後、補正する前のRGB画像と補正したRGB画像を表示し,フォルダに保存する方法をご教授お願い致します。
よろしくお願いいたします。

 Akzeptierte Antwort

Atsushi Ueno
Atsushi Ueno am 8 Okt. 2023

0 Stimmen

下部に解説を書きました。
I = imread("peppers.png");
hoseiRGB = uint8(cat(3,2,3,4)).* I; % 各ピクセルごとのRGB値(色)の変換
imwrite(hoseiRGB, "hoseiRGB.jpg"); % フォルダに保存
montage({I, hoseiRGB}); % 補正前後のRGB画像を並べて表示
uint8(26)*10 % uint8型は0-255。演算結果が255を超えると飽和する。
ans = uint8 255
RGBイメージは、uint8またはuint16型です。MATLABは演算結果が飽和するので、イメージデータをdoubleに変換しなくても問題ありません。
I = imread("peppers.png");
class(I) % peppers.png を imread で読み込むと uint8 型のイメージデータになる
ans = 'uint8'
size(I) % peppers.png は X*Y*3 の RGB データ
ans = 1×3
384 512 3
説明の為、RGB各層別に異なる係数を掛ける為の変数を作成しました。
COE = uint8(cat(3,2,3,4)) % RGB別の係数項を作成
COE = 1×1×3 uint8 array
COE(:,:,1) = 2 COE(:,:,2) = 3 COE(:,:,3) = 4
hoseiRGB = COE.* I; % 各ピクセルごとのRGB値(色)の変換

4 Kommentare

宗樹 岡本
宗樹 岡本 am 9 Okt. 2023
非常に勉強になりました。ご教授ありがとうございました。
Atsushi Ueno
Atsushi Ueno am 10 Okt. 2023
「飽和するから良い」と書きましたが、後で「飽和したら駄目なんじゃないかな」と思いました。
例えば先のプログラムで係数を10,100,1000と大きな値にすると真っ白な画像になってしまいます。
double値にすれば係数の比によってどんなに大きな値になっても、最後に最大値で割って正規化すれば飽和して真っ白な画像になる事はありません。
I = imread("peppers.png");
hoseiRGB = cat(3,2,3,4).* double(I); % 各ピクセルごとのRGB値(色)の変換
hoseiRGB = hoseiRGB ./ max(hoseiRGB,[],'all'); % 最大値で割って正規化
hoseiRGB = im2uint8(hoseiRGB); % uint8型に変換(正規化したdouble値のままでも可)
imwrite(hoseiRGB, "hoseiRGB.jpg"); % フォルダに保存
montage({I, hoseiRGB}); % 補正前後のRGB画像を並べて表示
宗樹 岡本
宗樹 岡本 am 24 Okt. 2023
続けて質問致しますが、
R = 2*R-10
G = 3*G-15
B = 4*B-20とするとき、
hoseiRGB = cat(3,2,3,4).*double(I)-cat(3,10,15,20)・・・(式1)
hoseiRGB = cat(3,2,3,4).*double(I)+cat(3,-10,-15,-20)・・・(式2)
式1と式2で出力される画像の色味が変わってしまうのですが,どちらが正しいのでしょうか?
Atsushi Ueno
Atsushi Ueno am 24 Okt. 2023
負値になる事もあるのですね。先の下記命令は正の実数しか考慮していません。正規化については、あらゆる場面を考慮した normalize 関数に譲った方が良さそうです。
I = imread("peppers.png");
hoseiRGB = cat(3,2,3,4).* double(I) - cat(3,10,15,20); % 各ピクセル色の変換
hoseiRGB = normalize(hoseiRGB); % MATLABに頼った正規化
montage({I, hoseiRGB}); % 補正前後のRGB画像を並べて表示

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Produkte

Version

R2022a

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!