デジタル画像処理
Matlab を使用して画像を処理し、実験を記録します。
参考文献:フーリエ変換、画像強調、ヒストグラム、イコライゼーション
記事ディレクトリ
実験 1: 一般的に使用される数学的変換
1. Matlab は加算を使用して 2 つの異なる画像を重ね合わせます (カスタム)
- Matlab プログラム: (バージョン 2016a)
1. clear;
2. clc;
3. I= imread('OIP-C.jpg');%读入图片1
4. J=imread('OIP-D.jpg');%读入图片2
5. Is = stretchlim(I);%计算图片1的灰度图像的最佳输入区间
6. Js = stretchlim(J);%同理计算图片2
7. Ix=imadjust(I,Is,[0;1]);%调整图片1灰度图像的灰度范围
8. Jx=imadjust(J,Js,[0;1]);%同理调整图片2
9. P=imadd(Ix,Jx);%实现2副图相加运算
10. subplot(1,3,1);imshow(I);%创建子图、显示图像1
11. title('图像1');
12. subplot(1,3,2),imshow(J);%创建子图、显示图像2
13. title('图像2');
14. subplot(1,3,3),imshow(P);%创建子图、显示图像3
15. title('两幅图像进行相加操作后效果');
- 元画像、加工画像:
- 処理の説明と処理結果:
上記のアルゴリズム フローチャートに示すように、プログラムがワークスペースに保存されたデータを初期化してクリアした後、2 つの異なる画像を重ね合わせる場合は、まず Matlab の関数 imread を通じて 2 つの異なる画像を読み取り、2 つの画像に値を割り当てる必要があります。画像はそれぞれ受信変数 I、J を与えます。
2 つの画像が直接重ね合わされ、二重露光が発生することを考慮すると、画像に対してグレースケール処理を実行する必要があります。つまり、最初に関数ストレッチリムを通じて 2 つの画像のグレースケール画像の最適な入力間隔を計算し、 Is 変数と Js 変数に間隔値を設定します。次に、関数 imadjust を使用して、2 つの画像上の対応するグレースケール画像のグレースケール範囲を調整し、グレースケール処理された 2 つの画像 Ix および XXS を取得します。最後に、関数 imadd を使用して Ix と Jx を重ね合わせ、加算後の 2 つの画像を取得します。 Pの プログラムの終了前に、2 つの元の画像 I と J と加工画像 P がそれぞれ表示され、エフェクト画像から 2 つの画像がうまく重ね合わされていることがわかります。
2. Matlab は減算を使用して、同じシーンの違いがある 2 つのイメージ (カスタマイズされた) を減算します。
- Matlab プログラム: (バージョン 2016a)
1. clear;
2. clc;
3. I= imread('OIP-C.jpg');%读入图片1
4. J=imread('OIP-D.jpg');%读入图片2
5. P=imadd(I,J);%得到未进行灰度处理的加法图
6. imwrite(P,'OIP-E.jpg');%把处理过的图片写出保存
7. %图像相减
8. %实现2副存在差异的图相减运算
9. Px=imsubtract(P,I);
10. %实现2副相同图做减法运算
11. %Px=imsubtract(P,P);
12. subplot(1,3,1),imshow(P),xlabel('A');
13. subplot(1,3,2),imshow(I),xlabel('B');
14. subplot(1,3,3),imshow(Px),xlabel('A-B');
- 元の画像、処理された画像。
シナリオ 1: 同じシーンに差分がある 画像の減算:
シナリオ 2: 同じ 2 つの画像の減算:
- 処理の説明と処理結果:
上記のアルゴリズム フローチャートに示すように、プログラムはデータを保存するためにワークスペースを初期化してクリアした後、最初に同じシーンの違いのある 2 つの画像を取得する必要があるため、上記の加算アルゴリズムと、得られた加算画像を他の 2 つの画像と同様に計算する 同じシーン内でも画像の使用方法に違いがあります。
グレースケール操作を行わずにイメージ 3 を取得するには、最初にイメージ 1 と 2 を読み込み、関数 imwrite を使用してイメージ 3 を保存する必要があります。差分のある 2 つのイメージを取得した後、関数 imsubtract を使用して 2 つのイメージを減算し、最後に処理されたイメージを表示します。
減算演算には 2 種類あり、コードを変更することで得られる画像は 2 種類あり、1 つは同じシーン内の差分のある 2 枚の画像を減算するもので、次のような効果が得られます。もう 1 つは、2 つの同一の画像が減算された状況で、減算処理後の画像全体が完全に黒であることがわかります。これは、減算された 2 つの画像が同じであることを意味します。
3. Matlab を使用して、画像のパワー スペクトルと位相スペクトルを計算します (カスタマイズ。明らかなテクスチャ特徴を持つことをお勧めします)。
- Matlab プログラム: (バージョン 2016a)
1. clc;
2. clear;
3. img = imread('hua.jpg');
4. imggray = rgb2gray(img);%灰度处理
5. imgf = fft2(imggray);%傅里叶变换二维快速傅里叶变换函数
6. imgfshift = fftshift(imgf);%频谱图中零频率成分移动至频谱图中心
7. %获得傅里叶变换的幅度谱
8. imgA = log(1+abs(imgfshift));%对数变换,压缩动态范围
9. %由幅度谱求出功率谱 对信号傅里叶变换--幅度谱--取模求平方--功率谱
10. imgB=abs(imgfshift).^2;
11. imgB=10 * log10(imgB);
12. %获得傅里叶变换的相位谱
13. imgPhase = log(angle(imgfshift)*180/pi);
14. %变换后图像矩阵大多是复试矩阵,包含实部虚部
15. %需要对数组元素进行绝对值处理求其复数矩阵的模,在进行对数变换进行显示
16. imgPhase=log(abs(imgPhase)+1);
17. subplot(2,2,1);
18. imshow(img);
19. title('原图像');
20. subplot(2,2,2);
21. imshow(imggray);
22. title('灰度处理后的原图像');
23. subplot(2,2,3);
24. imshow(imgB,[]); %显示图像的功率谱,参数’[]'是为了将其值线性拉伸
25. title('图像功率谱');
26. subplot(2,2,4);
27. imshow(imgPhase,[]);
28. title('图像相位谱');
-
元の画像、処理された画像。
-
処理のプロセスと結果の説明。
上記のアルゴリズム フローチャートに示すように、プログラムがデータを保存するためにワークスペースを初期化してクリアした後、最初に画像 1 を読み込み、関数 rgb2gray を使用してそのグレースケール イメージを取得します。グレースケール イメージを取得した後、次に従ってスペクトル図を取得します。フーリエ変換への変換、2 次元高速フーリエ変換関数 fft2 を選択してグレースケール イメージを処理し、スペクトログラムで関数 fftshift を使用してスペクトログラムの 0 周波数成分をスペクトログラムの中心に移動し、次にスペクトログラムからそれぞれパワーマップ、およびスペクトログラムから位相マップへ 画像のパワーダイアグラムとフェーズダイアグラムを計算する式。
プログラムを初めて実行すると、「警告: 複素入力項目の実部を表示します。」というプロンプト メッセージが表示されますが、関連情報を照会した後、フーリエ変換後に関数 imshow によって画像が直接表示されることがわかります。 、上記のエラーが表示されます。したがって、処理された位相マップとパワーマップに対して二次処理を実行する必要があります。つまり、abs 関数を使用してその複素行列の係数を取得し、対数変換により画像表示を最適化する必要があります。