2011-07-06 45 views
2

我想在modelImage的中心放置在pPoint的baseImage(RGB圖像)上放置一個modelImage(RGB圖像)。如何將圖像A放到圖像B上但我想要忽略圖像的所有O像素A

我已經寫了函數。

它的工作原理。但是,modelImage中有一些像素爲0。我不想將modelImage的0像素放在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?

+0

請不要使用FOR循環,因爲它會降低方案 – John

回答

2

有可能是爲了簡化的方式,但類似(未經測試):

% 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

%的速度全部替換,但非-zeros tmpImage(nzs,:) = modelImage(nzs,:); return「???索引超出矩陣的維數」。 – John

+0

更改非零的指示器映射並替換所有非零的代碼都可以工作。感謝Oli Charlesworth – John

+0

是的,我認爲我的代碼在這方面略有破裂。但是,答案中的代碼現在將獨立地在每個顏色平面上進行非零替換。那是你要的嗎? –

-1
% 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; 
+1

爲什麼重現奧利的答案? –

+0

@ jilles de wit:在我重現奧利的答案之前,他的回答並不真實。現在他修改了它。 – John

相關問題