Un editor di immagini – Pixel per Pixel
Questo codice è stato scritto per gestire in modo accurato la fase di digitalizzazione di un immagine. Quando si vuole applicare degli algoritmi Per qualche motivo potrebbe essere necessario trattare un file PNG o Jpeg con un processo di suddivisione dei domini spaziali ridotto ad un numero inferiore a 10. Un immagine in bianco e nero potrebbe ad esempio diventare una matrice matematica contenente solamente due possibili numeri: 0 e 1.
Nel caso in cui il contorno di un file jpeg venga ricavato da un immagine compressa la fase di digitalizzazione spaziale potrebbe presentare dei problemi con piccoli artefatti sparsi all’interno della matrice bidimensionale. Molto spesso è anche necessario definire in modo più netto i contorni e/o aggiustare delle piccole zone per rendere più efficaci gli algoritmi che vogliamo utilizzare in seguito. Prima di costruire un mosaico o una mesh bidimensionale su di una superficie piana, questa fase di ritocco accurato è indispensabile.
% Autori
% Prof. Danilo Pasquini IPSIA Parodi Delfino, Colleferro (Roma)
% Prof. Paolo Sordi IPSIA A. Pacinotti, Pontedera (Pisa)
function varargout = edita_immagine(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @edita_immagine_OpeningFcn, ...
'gui_OutputFcn', @edita_immagine_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before edita_immagine is made visible.
function edita_immagine_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to edita_immagine (see VARARGIN)
% Choose default command line output for edita_immagine
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes edita_immagine wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = edita_immagine_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on key press over figure1 with no controls selected.
function figure1_KeyPressFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global matrice_nuova
global colore
global passo
save matrice_ausiliaria matrice_nuova
if isequal(get(hObject,'CurrentKey'),'m')
beep
coord = ceil(get(gca,'CurrentPoint'))
whos
matrice_nuova (coord(1,2),coord(1,1))=0;
get(handles.axes1)
end
if isequal(get(hObject,'CurrentKey'),'c')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
colore = matrice_nuova (coord(1,2),coord(1,1));
end
if isequal(get(hObject,'CurrentKey'),'v')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
matrice_nuova (coord(1,2),coord(1,1)) =colore;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
%
end
if isequal(get(hObject,'CurrentKey'),'b')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
matrice_nuova (indices) = colore;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
if isequal(get(hObject,'CurrentKey'),'+')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
colore_nuovo = max(matrice_nuova(:)) + 1
indices = find(matrice_nuova ~= matrice_nuova (coord(1,2),coord(1,1)));
matrice_nuova (indices) = colore_nuovo;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
%--------------------------------------------------------------------------
%--------------------------------------------------------------------------
%--------------------------------------------------------------------------
if isequal(get(hObject,'CurrentKey'),'g')
beep
[larg,lung] = size (matrice_nuova);
coord = (get(gca,'CurrentPoint')) + 0.5;
coord = floor(coord);
colore_nuovo = max(matrice_nuova(:)) + 1
i1 = coord(1,2);
j1 = coord(1,1);
colore_vecchio = matrice_nuova (i1,j1);
matrice_nuova (i1,j1) = colore_nuovo;
finito = 0;
while finito == 0
finito = 1;
for i = 1:larg
for j =1:lung
if matrice_nuova (i,j) == colore_nuovo
if matrice_nuova (i+1,j) == colore_vecchio
matrice_nuova (i+1,j) = colore_nuovo;
finito = 0;
end
if matrice_nuova (i-1,j) == colore_vecchio
matrice_nuova (i-1,j) = colore_nuovo;
finito = 0;
end
if matrice_nuova (i,j+1) == colore_vecchio
matrice_nuova (i,j+1) = colore_nuovo;
finito = 0;
end
if matrice_nuova (i,j-1) == colore_vecchio
matrice_nuova (i,j-1) = colore_nuovo;
finito = 0;
end
end
end
end
end
colore_contorno = colore_nuovo +1
for i = 1:larg
for j =1:lung
if matrice_nuova (i,j) == colore_nuovo
if matrice_nuova (i+1,j) ~= colore_nuovo && matrice_nuova (i+1,j) ~= colore_contorno
matrice_nuova (i,j) = colore_contorno;
finito = 0;
end
if matrice_nuova (i-1,j) ~= colore_nuovo && matrice_nuova (i-1,j) ~= colore_contorno
matrice_nuova (i,j) = colore_contorno;
finito = 0;
end
if matrice_nuova (i,j+1) ~= colore_nuovo && matrice_nuova (i,j+1) ~= colore_contorno
matrice_nuova (i,j) = colore_contorno;
finito = 0;
end
if matrice_nuova (i,j-1) ~= colore_nuovo && matrice_nuova (i,j-1) ~= colore_contorno
matrice_nuova (i,j) = colore_contorno;
finito = 0;
end
end
end
end
% matrice_nuova (indices) = colore;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
[y,x,v]= find(matrice_nuova==colore_contorno);
save punti_contorno x
save punti_contorno y -append
save punti_contorno v -append
save punti_contorno matrice_nuova -append
save punti_contorno colore_contorno -append
beep
end
if isequal(get(hObject,'CurrentKey'),'r')
[larg,lung] = size (matrice_nuova);
coord = (get(gca,'CurrentPoint')) + 0.5;
coord = floor(coord);
colore_nuovo = max(matrice_nuova(:)) + 1
i1 = coord(1,2);
j1 = coord(1,1);
colore_vecchio = matrice_nuova (i1,j1);
matrice_nuova (i1,j1) = colore_nuovo;
finito = 0;
while finito == 0
finito = 1;
for i = 1:larg
for j =1:lung
if matrice_nuova (i,j) == colore_nuovo
if matrice_nuova (i+1,j) == colore_vecchio
matrice_nuova (i+1,j) = colore_nuovo;
finito = 0;
end
if matrice_nuova (i-1,j) == colore_vecchio
matrice_nuova (i-1,j) = colore_nuovo;
finito = 0;
end
if matrice_nuova (i,j+1) == colore_vecchio
matrice_nuova (i,j+1) = colore_nuovo;
finito = 0;
end
if matrice_nuova (i,j-1) == colore_vecchio
matrice_nuova (i,j-1) = colore_nuovo;
finito = 0;
end
end
end
end
end
% matrice_nuova (indices) = colore;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
if isequal(get(hObject,'CurrentKey'),'1')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
matrice_nuova (indices) = 1;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
if isequal(get(hObject,'CurrentKey'),'2')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
matrice_nuova (indices) = 2;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
if isequal(get(hObject,'CurrentKey'),'3')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
matrice_nuova (indices) = 3;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
if isequal(get(hObject,'CurrentKey'),'4')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
matrice_nuova (indices) = 4;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
if isequal(get(hObject,'CurrentKey'),'5')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
matrice_nuova (indices) = 5;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
if isequal(get(hObject,'CurrentKey'),'6')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
matrice_nuova (indices) = 6;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
if isequal(get(hObject,'CurrentKey'),'7')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
matrice_nuova (indices) = 7;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
if isequal(get(hObject,'CurrentKey'),'8')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
matrice_nuova (indices) = 8;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
if isequal(get(hObject,'CurrentKey'),'n')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
matrice_nuova (indices) = 204;
x_old = xlim
y_old = ylim
imagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
end
if isequal(get(hObject,'CurrentKey'),'q') % ingrandisce
beep
coord = (get(gca,'CurrentPoint')) + 0.5;
coord = floor(coord);
x_old = xlim .* passo;
y_old = ylim .* passo;
xlim ([coord(1,1)- (x_old(2)-x_old(1)) / 2, coord(1,1)+(x_old(2)-x_old(1)) / 2]) ;
ylim ([coord(1,2)- (y_old(2)-y_old(1)) / 2, coord(1,2)+(y_old(2)-y_old(1)) / 2]) ;
end
if isequal(get(hObject,'CurrentKey'),'w') % rimpicciolisce
beep
coord = (get(gca,'CurrentPoint')) + 0.5;
coord = floor(coord);
x_old = xlim ./ passo;
y_old = ylim ./ passo;
xlim ([coord(1,1)- (x_old(2)-x_old(1)) / 2, coord(1,1)+(x_old(2)-x_old(1)) / 2]) ;
ylim ([coord(1,2)- (y_old(2)-y_old(1)) / 2, coord(1,2)+(y_old(2)-y_old(1)) / 2]) ;
end
if isequal(get(hObject,'CurrentKey'),'p') % pan
beep
coord = (get(gca,'CurrentPoint')) + 0.5;
coord = floor(coord);
x_old = xlim ;
y_old = ylim ;
xlim ([coord(1,1)- (x_old(2)-x_old(1)) / 2, coord(1,1)+(x_old(2)-x_old(1)) / 2]) ;
ylim ([coord(1,2)- (y_old(2)-y_old(1)) / 2, coord(1,2)+(y_old(2)-y_old(1)) / 2]) ;
end
if isequal(get(hObject,'CurrentKey'),'e')
xlim('auto')
ylim('auto')
end
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global matrice_nuova
global hText
global passo
load matrice_nuova_senza_zeri matrice_nuova
massimo = max(matrice_nuova(:))
[larg,lung] = size (matrice_nuova)
numero_colori = 0
imagesc(matrice_nuova)
impixelinfo
passo = 1.4
axis equal
% --- Executes on mouse press over figure background.
function figure1_ButtonDownFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
beep
% --- Executes on mouse press over axes background.
function axes1_ButtonDownFcn(hObject, eventdata, handles)
% hObject handle to axes1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global matrice_nuova
clc
beep
coord = ceil(get(gca,'CurrentPoint'))
matrice_nuova (coord(1,2),coord(1,1))=0;
image(matrice_nuova)
drawnow
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global matrice_nuova
save matrice_finita matrice_nuova
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
impixelinfo
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global matrice_nuova
global hText
global passo
load matrice_contorno
matrice_nuova = matrice_contorno;
massimo = max(matrice_nuova(:))
[larg,lung] = size (matrice_nuova)
numero_colori = 0
imagesc(matrice_nuova)
impixelinfo
passo = 1.4