Как поместить изображение A на изображение B, но я хочу игнорировать все O пикселей изображения A - PullRequest
2 голосов
/ 06 июля 2011

Я хочу поместить modelImage (изображение RGB) в baseImage (изображение RGB), где центр modelImage будет расположен в pPoint.

Я уже написал функцию.

И это работает. Однако в модели image есть около 0 пикселей. Я не хочу размещать 0 пикселей modelImage на baseImage. Можете ли вы помочь мне изменить мою функцию?

% Put the modelImage onto baseImage at pPoint
function newImage = imgTranslate(modelImage,baseImage, pPoint)

[nRow nCol noDim] = size(modelImage);


pPointX = pPoint(1);
pPointY = pPoint(2);

startColumn = pPointY - nCol/2;
startRow = pPointX - nRow/2;

startColumn = round(startColumn);
startRow = round(startRow);

endColumn = startColumn+ nCol;
endRow = startRow+nRow;

%% Place modelImage onto baseImage BUT I WANT TO IGNORE O pixels of modelImage
baseImage(startRow:(endRow-1),startColumn:(endColumn-1),:) = modelImage;
newImage = baseImage;

Использование FOR и IF работает, но замедляет работу программы

%%
for i = startRow: (endRow-1)
    x = (i-startRow +1);
    for j = startColumn : (endColumn-1)
         y = j-startColumn + 1;
        if modelImage(x,y,:)~=0
            baseImage(i,j,:) = modelImage(x,y,:);
        end
    end
end

Любой способ не использовать FOR и IF?

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Может быть способ упростить это, но что-то вроде (не проверено):

% Indicator map of non-zeros
nzs = any(modelImage,3);
nzs = repmat(nzs, [1 1 3]);

% Crop destination image
tmpImage = baseImage(startRow:(endRow-1),startColumn:(endColumn-1),:);

% Replace all but non-zeros
tmpImage(nzs) = modelImage(nzs);

% Place into output image as before
baseImage(startRow:(endRow-1),startColumn:(endColumn-1),:) = tmpImage;
0 голосов
/ 06 июля 2011
% Indicator map of non-zeros
zs = modelImage(:,:,:)==0;
nzs = ~zs;

% Crop destination image
tmpImage = baseImage(startRow:(endRow-1),startColumn:(endColumn-1),:);

% Replace all but non-zeros
tmpImage(nzs) = modelImage(nzs);

% Place into output image as before
baseImage(startRow:(endRow-1),startColumn:(endColumn-1),:) = tmpImage;
...