cc=bwconncomp return empty PixelIdxList

조회 수: 1 (최근 30일)
XIANG SONG
XIANG SONG 2020년 10월 28일
답변: Nagasai Bharat 2020년 11월 25일
I'm working on a alpha matting project that reqires to calculating connectivity error of predicted alpha matte and ground truth alpha matte. However after input the image my code get error indicating the cc.cc.PixelIdxList has a row of empty cell array, which alwasy stop the code from runing? how can i fix it? i did convert the image to grayscale first.
Thanks
% pred: the predicted alpha matte
% target: the ground truth alpha matte
% trimap: the given trimap
% step = 0.1
function loss = compute_connectivity_error(pred,target,trimap,step)
pred = single(pred)/255;
target = single(target)/255;
%320,320
[dimy,dimx] = size(pred);
thresh_steps = 0:step:1;
%l_map is -1 matix with same shape as pred
l_map = ones(size(pred))*(-1);
dist_maps = zeros([dimy,dimx,numel(thresh_steps)]);
% ii=[0,0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0]
for ii = 2:numel(thresh_steps)
pred_alpha_thresh = pred>=thresh_steps(ii);
target_alpha_thresh = target>=thresh_steps(ii);
%%% error from here
cc = bwconncomp(pred_alpha_thresh & target_alpha_thresh,4);
cc.PixelIdxList
size_vec = cellfun(@numel,cc.PixelIdxList);
[biggest,max_id] = max(size_vec);
omega = zeros([dimy,dimx]);
omega(cc.PixelIdxList{max_id}) = 1;
flag = l_map==-1 & omega==0;
l_map(flag==1) = thresh_steps(ii-1);
dist_maps(:,:,ii) = bwdist(omega);
dist_maps(:,:,ii) = dist_maps(:,:,ii) / max(max(dist_maps(:,:,ii)));
end
l_map(l_map==-1) = 1;
pred_d = pred - l_map;
target_d = target - l_map;
pred_phi = 1 - pred_d .* single(pred_d>=0.15);
target_phi = 1 - target_d .* single(target_d>=0.15);
loss = sum(sum(abs(pred_phi - target_phi).*single(trimap==128)));

답변 (1개)

Nagasai Bharat
Nagasai Bharat 2020년 11월 25일
Hi,
The error arises from the cc.PixelIdxList which is here a empty cell array. cc.PicelIdxList is an empty cell array due to the reason that the binay image(pred_alpha_thresh & target_alpha_thresh) sent into the bwconncomp function is a completely black image(all zeros) which has no connected components.
Cross check the pred_alpha_thresh and target_alpha_thresh values and ensure the output is not all zeros.
The following code would show you the case.
img = zeros([256, 256]);
cc = bwconncomp(img,4);
cc.PixelIdxList

카테고리

Help CenterFile Exchange에서 Get Started with Image Processing Toolbox에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by