Clear Filters
Clear Filters

二値化画像での大きいノイズの削除

34 views (last 30 days)
翔
on 19 Jan 2023
Commented: on 21 Jan 2023
二値化された画像から特定の物体を検出したいです。(夜間撮影された水面の画像から、ペットボトル(画像内右上に存在)を特定する。)しかし、光の反射も同時に検出してしまいます。この光の反射部分を取り除く方法はありますでしょうか。また、個々の白領域のピクセル数が一定以上の場合に除去する関数(bwareaopenの逆)はありますか?よろしくお願いします。
I = readimage("DSCF0009.JPG");
%トリミング
I_Trim = imcrop(I,[0 0 3072 1500]);
%しきい値のローカル関数
I2 = night_bi1(I_Trim);
%モルフォロジー演算で二値化領域の穴を埋める
SE = strel('disk',5);
BW1 = imopen(I2,SE);
%マスクの反転
BW2 = imcomplement(BW1);
%1000ピクセル以下の領域を削除
I_Binalized = bwareaopen(BW2,1000);
I_Binalized = imclearborder(I_Binalized,8);

Accepted Answer

Hiro Yoshino
Hiro Yoshino on 20 Jan 2023
こんな感じでどうでしょうか?
I = imread("DSCF0009.JPG");
imshow(I)
%トリミング
I_Trim = imcrop(I,[0 0 3072 1500]);
imshow(I_Trim)
%しきい値のローカル関数
I2 = night_bi1(I_Trim);
imshow(I2)
%モルフォロジー演算で二値化領域の穴を埋める
SE = strel('disk',5);
BW1 = imopen(I2,SE);
%マスクの反転
BW2 = imcomplement(BW1);
%1000ピクセル以下の領域を削除
I_Binalized = bwareaopen(BW2,1000);
I_Binalized = imclearborder(I_Binalized,8);
imshow(I_Binalized)
% 追加部分
cc = bwconncomp(I_Binalized)
cc = struct with fields:
Connectivity: 8 ImageSize: [1500 3072] NumObjects: 4 PixelIdxList: {[1865×1 double] [1161×1 double] [1717×1 double] [2013×1 double]}
stats = regionprops(cc,"Area")
stats = 4×1 struct array with fields:
Area
idx = find([stats.Area] > 2000);
BW2 = ismember(labelmatrix(cc),idx);
imshow(BW2)
  1 Comment
翔
on 21 Jan 2023
ありがとうございました!

Sign in to comment.

More Answers (1)

Shunichi Kusano
Shunichi Kusano on 20 Jan 2023
私からはこれだけ。
>個々の白領域のピクセル数が一定以上の場合に除去する関数(bwareaopenの逆)はありますか?
bwareafilt関数が使えます。範囲指定ができます。
  1 Comment
翔
on 21 Jan 2023
便利そうです。ありがとうございます。

Sign in to comment.

Products


Release

R2022b

Community Treasure Hunt

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

Start Hunting!