- 動画ファイルのフレームを1枚ずつ画像処理する方法
- 画像処理(ノイズの除去)
- 画像処理(シャープ化)
MATLABを用いた動画ファイルのノイズ除去・シャープ化について
16 views (last 30 days)
Show older comments
お世話になります。
撮影した動画のノイズを除去し、シャープ化する方法を調べているのですが、適した方法を見つけることができません。SimlinkではなくMATLABを使用したいと考えています。
これまでに見つけた方法はMATLABではなくSimLinkのものだけでした。↓
ノイズ除去に関しては、画像に対する、SimlinkではなくMATLABを使っての方法があるようですが、私が求めているのは動画に対するものです。↓
MATLABを利用してノイズの除去・シャープ化を行う方法をどなたかご教示いただけないでしょうか?
よろしくお願いいたします。
Accepted Answer
Atsushi Ueno
on 13 Dec 2021
Edited: Atsushi Ueno
on 14 Dec 2021
その1:>MATLABを利用してノイズの除去を行う方法
ごま塩ノイズ - Wikipedia >この種類のノイズの効果的なノイズ除去方法は、メディアンフィルターまたはモルフォロジーフィルターである。 ソルトノイズまたはペッパーノイズのいずれか(両方ではない)を低減するには、逆調和平均フィルターが効果的である。
I = imread('eight.tif');
%% ごま塩ノイズ付加
% I = imnoise(I,'salt & pepper',0.02); % ⇒Image Processing Toolbox要
for index = 1:1000
I(randi(size(I,1)),randi(size(I,2)),:) = 255*(randi(2)-1); % ごま塩ノイズ付加(MATLABでOK)
end
%% 平均化フィルタ
% Kaverage = filter2(fspecial('average',3),Img)/255; % ⇒Image Processing Toolbox要
hsize = [3,3]; H = ones(hsize(1),hsize(2))/(hsize(1)*hsize(2));
Kaverage = uint8(conv2(I,H,'same')); % 平均化フィルタ適用(MATLABでOK)
%% メディアンフィルタ
% Kmedian = medfilt2(I); % ⇒Image Processing Toolbox要
Kmedian = I; % 端っこは元画像のまま(ちょっとインチキ)
for y = 2:size(I,1)-1 % メディアンフィルタ適用(MATLABでOK)
for x = 2:size(I,2)-1
Kmedian(y,x) = median(I(y-1:y+1,x-1:x+1),'all');
end
end
% 左から:ごま塩ノイズ付加画像, 平均化フィルタ適用結果, メディアンフィルタ適用結果
montage({I,Kaverage,Kmedian}, 'Size', [1 3]);
その2:>MATLABを利用してシャープ化を行う方法
I = imread('eight.tif');
%% 平均化(ぼかし)フィルタ
% Kaverage = filter2(fspecial('average',3),Img)/255; % ⇒Image Processing Toolbox要
hsize = [3,3]; H = ones(hsize(1),hsize(2))/(hsize(1)*hsize(2));
Bokasi = uint8(conv2(I,H,'same')); % 平均化フィルタ適用(MATLABでOK)
%% シャープ化フィルタ
S = [0 -1 0; -1 5 -1; 0 -1 0];
Sharp = uint8(conv2(Bokasi,S,'same')); % ぼかし画像にシャープ化フィルタ適用(MATLABでOK)
% 左から:元画像, ぼかし画像, ぼかし画像のシャープ化画像
montage({I,Bokasi,Sharp}, 'Size', [1 3]);
その3:動画ファイルのフレームを1枚ずつ画像処理する方法
上記を参考に、その2のぼかしフィルタ(カラー画像対応版)を適用しました。
hsize = [1,20]; % その2よりも横方向のみ強くぼかす
H = ones(hsize(1),hsize(2))/(hsize(1)*hsize(2)); % 平均化(ぼかし)フィルタ
vidObj = VideoReader('xylophone.mp4'); % ビデオファイルを読み取り
while hasFrame(vidObj) % 次のビデオフレームがあったら
vidFrame = readFrame(vidObj); % 次のビデオフレームを読み取り
R = uint8(conv2(vidFrame(:,:,1),H,'same')); % 平均化フィルタ適用(MATLABでOK)
G = uint8(conv2(vidFrame(:,:,2),H,'same'));
B = uint8(conv2(vidFrame(:,:,3),H,'same'));
vidFrame = cat(3,R,G,B); % RGB別にぼかした画像を元通りにくっ付ける
imshow(vidFrame); % 表示
pause(1/vidObj.FrameRate); % フレームレート分停止する
end
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!