Soru sorDöngüyle Crop edilen Bölgeyi Sınırsız Çoğaltma
sezen tarafından 6 yıl önce soruldu

Merhabalar,
Görüntü işleme üzerine Matlab kullanmaya başladım. Resim üzerinden belli bir bölgeyi tek sefer croplayarak başka bir yere kopyalayabiliyorum ancak bunu belli bir tuşa basana kadar devam ettirmek istiyorum. Sanırım döngü kurmak gerekiyor ancak doğru döngüyü bir türlü kuramadım. Aşağıdaki kodun crop+paste işlemini ESC tuşuna basıncaya kadar sürdürülmesini nasıl sağlayabileceğim konusunda destek olabilecek var mıdır? Loop start ve loop ends yazan kısımlar döngünün olacağı kısımlardır.
 

clc;
clearvars;
close all;
imtool close all; % Close all imtool figures.
workspace;
format longg;
format compact;
fontSize = 20;
tic;
% Have user browse for a file, from a specified "starting folder."
% For convenience in browsing, set a starting folder from which to browse.
startingFolder = 'C:\Program Files\MATLAB';
if ~exist(startingFolder, 'dir')
% If that folder doesn't exist, just start in the current folder.
startingFolder = pwd;
end
% Get the name of the file that the user wants to use.
defaultFileName = fullfile(startingFolder, '*.jpg');
[baseFileName, folder] = uigetfile(defaultFileName, 'Select a file');
if baseFileName == 0
% User clicked the Cancel button.
return;
end
fullFileName = fullfile(folder, baseFileName)
original = imread(fullFileName);
grayImage = original;

% Get the dimensions of the image. %LOOP STARTS%
% numberOfColorBands should be = 1.
[rows columns numberOfColorBands] = size(grayImage);
% Display the original gray scale image.
imshow(grayImage);
axis on;
title('Original Grayscale Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Give a name to the title bar.
set(gcf,'name','Create an Object','numbertitle','off')
% Ask user to draw a box.
promptMessage = sprintf('Drag out a box on the region that you want to copy,\nor Cancel to abort processing?');
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'Continue', 'Cancel', 'Continue');
if strcmpi(button, 'Cancel')
return;
end
k = waitforbuttonpress;
point1 = get(gca,'CurrentPoint'); 
finalRect = rbbox; % return figure units
point2 = get(gca,'CurrentPoint'); % button up detected
point1 = point1(1,1:2); % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2); % calculate locations
offset = abs(point1-point2); % and dimensions
% Find the coordinates of the box.
xCoords = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)];
yCoords = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)];
x1 = round(xCoords(1));
x2 = round(xCoords(2));
y1 = round(yCoords(5));
y2 = round(yCoords(3));
hold on
axis manual
plot(xCoords, yCoords, 'b-'); % redraw in dataspace units
% Display the cropped image.
croppedImage = grayImage(y1:y2,x1:x2);
imshow(croppedImage);
axis on;
title('Region that you defined', 'FontSize', fontSize);
% Paste it onto the original image
[rows2 columns2] = size(croppedImage)
promptMessage = sprintf('Click on the upper left point where you want to paste it,\nor Cancel to abort processing?');
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'Continue', 'Cancel', 'Continue');
if strcmpi(button, 'Cancel')
return;
end
[x, y] = ginput(1)
% Determine the pasting boundaries.
r1 = int32(y);
c1 = int32(x);
r2 = r1 + rows2 - 1;
r2 = min([r2 rows]);
c2 = c1 + columns2 - 1;
c2 = min([c2, columns]);
plot([c1 c2 c2 c1 c1], [r1 r1 r2 r2 r1], 'r-');
% Paste as much of croppedImage as will fit into the original image.
grayImage(r1:r2, c1:c2) = croppedImage(1:(r2-r1+1), 1:(c2-c1+1));
imshow(grayImage);
axis on;
title('Cropped and duplicated object', 'FontSize', fontSize); %LOOP ENDS%
% Ask user to draw a box.
promptMessage = sprintf('Drag out a box on the region that you want to copy,\nor Cancel to abort processing?');
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'Continue', 'Cancel', 'Continue');
if strcmpi(button, 'Cancel')
return;
end
k = waitforbuttonpress;
point1 = get(gca,'CurrentPoint'); 
finalRect = rbbox; % return figure units
point2 = get(gca,'CurrentPoint'); % button up detected
point1 = point1(1,1:2); % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2); % calculate locations
offset = abs(point1-point2); % and dimensions
% Find the coordinates of the box.
xCoords = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)];
yCoords = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)];
x1 = round(xCoords(1));
x2 = round(xCoords(2));
y1 = round(yCoords(5));
y2 = round(yCoords(3));
hold on
axis manual
plot(xCoords, yCoords, 'b-'); % redraw in dataspace units
% Display the cropped image.
croppedImage = grayImage(y1:y2,x1:x2);
imshow(croppedImage);
axis on;
title('Region that you defined', 'FontSize', fontSize);
% Paste it onto the original image
[rows2 columns2] = size(croppedImage)
promptMessage = sprintf('Click on the upper left point where you want to paste it,\nor Cancel to abort processing?');
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'Continue', 'Cancel', 'Continue');
if strcmpi(button, 'Cancel')
return;
end
[x, y] = ginput(1)
% Determine the pasting boundaries.
r1 = int32(y);
c1 = int32(x);
r2 = r1 + rows2 - 1;
r2 = min([r2 rows]);
c2 = c1 + columns2 - 1;
c2 = min([c2, columns]);
plot([c1 c2 c2 c1 c1], [r1 r1 r2 r2 r1], 'r-');
% Paste as much of croppedImage as will fit into the original image.
grayImage(r1:r2, c1:c2) = croppedImage(1:(r2-r1+1), 1:(c2-c1+1));
imshow(grayImage);
axis on;
title('Cropped and duplicated object', 'FontSize', fontSize); %LOOP ENDS%
% Get the name of the file that the user wants to save.
% Note, if you're saving an image you can use imsave() instead of uiputfile().
startingFolder = userpath % Or "pwd" or wherever you want.
defaultFileName = fullfile(startingFolder, '*.*');
[baseFileName, folder] = imsave(defaultFileName, 'Specify a file');
if baseFileName == 0
% User clicked the Cancel button.
return;
end
6 Cevap
En iyi cevap
sezen tarafından 6 yıl önce cevaplandı

Teşekkürler aşağıdaki şekilde çözdüm:

 

while(1)
% Paste it onto the original image
[rows2 columns2] = size(croppedImage)
promptMessage = sprintf('Click on the upper left point where you want to paste it,\nor Cancel to abort processing?');
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'Continue', 'Cancel', 'Continue');
if strcmpi(button, 'Cancel')
return;
end
[x, y] = ginput(1)
% Determine the pasting boundaries.
r1 = int32(y);
c1 = int32(x);
r2 = r1 + rows2 - 1;
r2 = min([r2 rows]);
c2 = c1 + columns2 - 1;
c2 = min([c2, columns]);
plot([c1 c2 c2 c1 c1], [r1 r1 r2 r2 r1], 'r-');
% Paste as much of croppedImage as will fit into the original image.
grayImage(r1:r2, c1:c2) = croppedImage(1:(r2-r1+1), 1:(c2-c1+1));
imshow(grayImage);
axis on;
title('Cropped and duplicated object', 'FontSize', fontSize); %LOOP ENDS%
end
sayginer Yönetici tarafından 6 yıl önce cevaplandı

Merhaba,
Asagidaki ornekte fonksiyonu ile birlikte bir ornek verilmis. Sanirim istediginiz sey bu olabilir?
 

sayginer Yönetici tarafından 6 yıl önce cevaplandı

Elde ettiğiniz sonucu paylaşarak katkı sağladığınız için ben teşekkür ederim.

sezen tarafından 6 yıl önce cevaplandı

Ne demek amaç da bu değil mi zaten :)

sezen tarafından 6 yıl önce cevaplandı

bu koda nasıl klavye tuşu atayabilirim? Örneğin L tuşuna ya da space'e basarak devreye almak ve devre dışı bırakmak istiyorum.waitbuttonpress'i denedim ancak işe yaramadı.

hakkans Yönetici tarafından 6 yıl önce cevaplandı

Matlab'ın kendi forumunda sizin istediğinize benzer bir soru buldum.
https://www.mathworks.com/matlabcentral/answers/78674-continue-execution-while-waiting-for-user-input
Burada cevap olarak aşağıdaki linkteki 3. parti kodlar tavsiye edilmiş. Bu kodları Matlab'a üye olup indirerek yazdığınız herhangi bir .m fonksiyonu gibi çağırabilirsiniz (çalıştığınız klasöre attıktan sonra)
https://www.mathworks.com/matlabcentral/fileexchange/?term=tag%3A%22kbhit%22