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

25 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.

Categories

Find more on Image Processing Toolbox in Help Center and File Exchange

Products


Release

R2022b

Community Treasure Hunt

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

Start Hunting!