How to avoid overlap two objects in image

1 回表示 (過去 30 日間)
Hafiz Muhammad Tayyab Abbas
Hafiz Muhammad Tayyab Abbas 2021 年 9 月 29 日
編集済み: DGM 2021 年 9 月 30 日
I have the sample image I used this template to create a dataset at a different angle and position. it works well for generating one object but when I want to create a dataset for two objects as shown in the output image, the second object hide behind the first object How can I process to create two objects on the image?
the output image overlappng
function img_generate(img_width,img_hight,patch1,patch2,n)
a= img_width;
b=img_hight;
for i=1:n
p =randi(300);
q = randi(300);
sample = patch1;
x= randi(a-p)
y = randi(b-q)
%% Angle
angle = randi(360);
sample = imrotate(sample,angle);
sample = imresize(sample,[p q]);
img = uint8(zeros(a,b,1));
img(x:x+p-1,y:y+q-1,:) = sample;
p =randi(500);
q = randi(500);
sample = patch2;
x= randi(a-p)
y = randi(b-q)
%% Angle
angle = randi(360);
sample = imrotate(sample,angle);
sample = imresize(sample,[p q]);
img(x:x+p-1,y:y+q-1,:) = sample;
%%
pathName = "D:\Hammad\New folder\datset";
fileName = fullfile(pathName,sprintf('%d.jpg',i));
imwrite(img,fileName);
end
clc; clear all; close all;
%% Image Size
img_width = 800;
img_hight = 800;
patch = imread("ImageResult.png");
patch = rgb2gray(patch);
n_images = 500;
img_generate_n(img_width,img_hight,patch,patch,n_images);

回答 (1 件)

DGM
DGM 2021 年 9 月 29 日
編集済み: DGM 2021 年 9 月 29 日
You're going to have to blend the sub-images as you combine them together. This is a simplified example of overlaying two copies of that image. Here are three simple blending methods that may be relevant.
% read image with alpha
[A,~,Aa] = imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/753289/image.png');
A = rgb2gray(im2double(A)).*im2double(Aa); % apply alpha
B = flip(A,2);
out_lighten = max(A,B);
imshow(out_lighten)
out_screen = 1-((1-A).*(1-B));
imshow(out_screen)
out_add = A+B;
imshow(out_add)
  5 件のコメント
yanqi liu
yanqi liu 2021 年 9 月 30 日
sir,may be save the information on the filename
fileName = sprintf('%d_%.2f_%.2f_%.2f.jpg',i,x,y,angle);
DGM
DGM 2021 年 9 月 30 日
編集済み: DGM 2021 年 9 月 30 日
There are a number of ways this could be done, but here's something basic:
function img_generate(img_width,img_hight,patch1,patch2,n)
a = img_width;
b = img_hight;
for i=1:n
p =randi(300);
q = randi(300);
sample = patch1;
x = randi(a-p);
y = randi(b-q);
% Angle
angle = randi(360);
sample = imrotate(sample,angle);
sample = imresize(sample,[p q]);
posdata = sprintf('%d,%d,%d\n',x,y,angle); % <--- store data
img = uint8(zeros(a,b,1));
img(x:x+p-1,y:y+q-1,:) = sample;
p =randi(500);
q = randi(500);
sample = patch2;
x = randi(a-p);
y = randi(b-q);
% Angle
angle = randi(360);
sample = imrotate(sample,angle);
sample = imresize(sample,[p q]);
posdata = [posdata sprintf('%d,%d,%d',x,y,angle)]; % <--- add another line
BG = img(x:x+p-1,y:y+q-1,:); % copy of any existing image content here
%img(x:x+p-1,y:y+q-1,:) = max(sample,BG); % lighten blend (for example)
img(x:x+p-1,y:y+q-1,:) = im2uint8(1-((1-im2double(sample)).*(1-im2double(BG)))); % screen blend (for example)
%img(x:x+p-1,y:y+q-1,:) = sample + BG; % addition blend (for example)
% i'm just dumping everything in my sandbox directory
fileName = sprintf('%0.3d.jpg',i); % consider using leading zeros to ease sorting issues
imwrite(img,fileName);
% write the stored data to disk
fileName = sprintf('%0.3d.txt',i);
fid = fopen(fileName,'w');
fprintf(fid,posdata);
fclose(fid);
end
end
You'll have to decide exactly what data you want to store (x&y offsets, height & width, centers, angle, etc), and how you want them formatted (headers, delimiters, etc)

サインインしてコメントする。

製品


リリース

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by