Лучший способ дополнить изображение на основе краевых пикселей (по строкам) - PullRequest
0 голосов
/ 30 января 2019

Я хочу заполнить объект на основе краевого пикселя, чтобы заменить нули.

Я не уверен, применимо ли к этому padarray, я показываю пример кода ниже, чтобы повторить мою потребность.Я могу сделать это, но я думаю, что это неэффективный способ, поскольку я сканирую каждую строку за раз, чтобы найти и заполнить нули.

%% Example code to recreate my need
image = imread('moon.tif');
[~, ncols] = size(image);
image(image <50) = 0;
image = fliplr(image(:,1:round(ncols/2)));
% figure, imshow(image,[])
BW = bwareafilt(logical(image),1);
% create bounding box
boxProps=regionprops(BW,'BoundingBox'); 
cords_BoundingBox = boxProps(1).BoundingBox;
% Extract sub_Image
sub_Image = imcrop(image, cords_BoundingBox);
% figure, imshow(sub_Image,[])
%% This is the part I want to use better or existing function for padding
duplicate_sub_Image = sub_Image;
[nrows, ~] = size(duplicate_sub_Image);
for nrow = 1:nrows
    % current_row_inverted = fliplr(sub_Image(nrow,:));
    [~,col,pad_value] = find(duplicate_sub_Image(nrow,:),1,'last');
    duplicate_sub_Image(nrow,col+1:end) = pad_value;
end
figure, 
subplot(131),imshow(image,[]), title('original image');
subplot(132),imshow(sub_Image,[]), title('bounding box image');
subplot(133),imshow(duplicate_sub_Image,[]), title('row padded image');

enter image description here Любойпредложения по улучшению этого кода или использованию существующих функций для решения этой проблемы?

Спасибо

1 Ответ

0 голосов
/ 30 января 2019

Вот способ без использования циклов:

[~,imin] = min(sub_Image, [], 2);
col = max(1, imin-1);
ind = sub2ind(size(sub_Image), (1:numel(col)).', col);

duplicate_sub_Image = sub_Image(ind) .* ~sub_Image + sub_Image;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...