ここでは畳み込みのない別の方法があります。 1つの複雑さを考慮する必要があるのは、各画像を各ドットの中央に配置する場合は、左上隅がどこにあるかを判断し、出力画像にインデックスを付けて、左上から目的のオブジェクトを描画する必要がありますコーナーを右下隅に合わせます。これは、各黒のドットの位置を取って、横幅の半分と縦幅の半分を減算することによって行うことができます。
今実際の問題に。画像全体ではなく黒い点のセットをループする方がはるかに効率的です。これを行うには、find
コマンドを使用して、0の行と列の位置を決定します。これを実行したら、行と列の座標の各ペアをループし、座標の減算を行い、出力イメージに置きます。
オブジェクトが重なる可能性があるという追加要件が課されます。これに対処するために、ピクセルを累積してから、ゼロ以外の場所の平均を求めます。
これに対応するように変更されたコードは次のとおりです。 JPEG圧縮を使用しているため、圧縮アーチファクトが発生するため、0の領域は必ずしも0でなくてもかまいません。また、オブジェクトがイメージの境界の外に出る場合もあります。したがって、これに対応するには、イメージを横幅の半分の2倍と縦の半分の2倍で十分にパッドし、オブジェクトの配置が完了した後に切り抜きます。
mainImage=imread('https://i.stack.imgur.com/gbhWJ.png');
secondaryImage=imread('https://i.stack.imgur.com/P0meM.png');
secondaryImageResized = imresize(secondaryImage, [250 300]);
% Find half height and width
rows = size(secondaryImageResized, 1);
cols = size(secondaryImageResized, 2);
halfHeight = floor(rows/2);
halfWidth = floor(cols/2);
% Create a padded image that contains our main image. Pad with white
% pixels.
rowsMain = size(mainImage, 1);
colsMain = size(mainImage, 2);
outputImage = 255*ones([2*halfHeight + rowsMain, 2*halfWidth + colsMain, size(mainImage, 3)], class(mainImage));
outputImage(halfHeight + 1 : halfHeight + rowsMain, ...
halfWidth + 1 : halfWidth + colsMain, :) = mainImage;
% Find a mask of the black pixels
mask = outputImage(:,:,1) < 128;
% Obtain black pixel locations
[row, col] = find(mask);
% Reset the output image so that they're all zeros now. We use this
% to output our final image. Also cast to ensure accumulation is proper.
outputImage(:) = 0;
outputImage = double(outputImage);
% Keeps track of how many times each pixel was hit by the object
% This is so that we can find the average at each location.
counts = zeros([size(mask), size(mainImage, 3)]);
% For each row and column location in the image
for i = 1 : numel(row)
% Get the row and column locations
r = row(i); c = col(i);
% Offset to get the top left corner
r = r - halfHeight;
c = c - halfWidth;
% Place onto final image
outputImage(r:r+rows-1, c:c+cols-1, :) = outputImage(r:r+rows-1, c:c+cols-1, :) + double(secondaryImageResized);
% Accumulate the counts
counts(r:r+rows-1,c:c+cols-1,:) = counts(r:r+rows-1,c:c+cols-1,:) + 1;
end
% Find average - Any values that were not hit, change to white
outputImage = outputImage ./ counts;
outputImage(counts == 0) = 255;
outputImage = uint8(outputImage);
% Now crop and show
outputImage = outputImage(halfHeight + 1 : halfHeight + rowsMain, ...
halfWidth + 1 : halfWidth + colsMain, :);
close all; imshow(outputImage);
% Write the final output
imwrite(outputImage, 'finalimage.jpg', 'Quality', 100);
は、我々が得る:

編集
私はあなたのイメージは、透明性を持っていたと言われていませんでした。したがって、あなたがする必要があるのはimread
ですが、確実にアルファチャンネルを読むことができます。次に、存在するかどうかを確認し、存在しない場合は、透明性のない値の背景が白に設定されるようにします。あなたは次のコードでそれを行うことができます。
mainImage=imread('https://i.stack.imgur.com/gbhWJ.png');
% Change - to accommodate for transparency
[secondaryImage, ~, alpha] = imread('https://i.imgur.com/qYJSzEZ.png');
if ~isempty(alpha)
m = alpha == 0;
for i = 1 : size(secondaryImage,3)
m2 = secondaryImage(:,:,i);
m2(m) = 255;
secondaryImage(:,:,i) = m2;
end
end
secondaryImageResized = imresize(secondaryImage, [250 300]);
% Rest of your code follows...
% ...
上記のコードは、バスケットボールの画像を読み込むように変更されました:これは中にロードされている画像を置き換える、あなたのコードの一番上に置かれますを確認します。コードの残りの部分は同じままで、私たちは、このように取得する:

ありがとうございました! 残念ながら、この画像では機能しません:i.imgur.com/qYJSzEZ.png –
ボールの黒い背景があります:https://i.imgur.com/bteofvh.jpg画像には... –
あなたの画像にアルファチャンネルがあるからです。私は自分のコードを変更する必要があります。 – rayryeng