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});
endif nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_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_immaginehandles.output = hObject;% Update handles structureguidata(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 structurevarargout{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_nuovaglobal coloreglobal passosave matrice_ausiliaria matrice_nuovaif isequal(get(hObject,'CurrentKey'),'m')
beep
coord = ceil(get(gca,'CurrentPoint'))
whosmatrice_nuova (coord(1,2),coord(1,1))=0;
get(handles.axes1)
endif isequal(get(hObject,'CurrentKey'),'c')
coord = (get(gca,'CurrentPoint')) + 0.5
coord = floor(coord)
colore = matrice_nuova (coord(1,2),coord(1,1));
endif 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 = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
%endif 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 = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
endif 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 = xlimy_old = ylimimagesc(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;endif matrice_nuova (i-1,j) == colore_vecchio
matrice_nuova (i-1,j) = colore_nuovo;
finito = 0;endif matrice_nuova (i,j+1) == colore_vecchio
matrice_nuova (i,j+1) = colore_nuovo;
finito = 0;endif matrice_nuova (i,j-1) == colore_vecchio
matrice_nuova (i,j-1) = colore_nuovo;
finito = 0;endendendendendcolore_contorno = colore_nuovo +1for 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;endif matrice_nuova (i-1,j) ~= colore_nuovo && matrice_nuova (i-1,j) ~= colore_contorno
matrice_nuova (i,j) = colore_contorno;
finito = 0;endif matrice_nuova (i,j+1) ~= colore_nuovo && matrice_nuova (i,j+1) ~= colore_contorno
matrice_nuova (i,j) = colore_contorno;
finito = 0;endif matrice_nuova (i,j-1) ~= colore_nuovo && matrice_nuova (i,j-1) ~= colore_contorno
matrice_nuova (i,j) = colore_contorno;
finito = 0;endendendend% matrice_nuova (indices) = colore;x_old = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
[y,x,v]= find(matrice_nuova==colore_contorno);
save punti_contorno xsave punti_contorno y -appendsave punti_contorno v -appendsave punti_contorno matrice_nuova -appendsave punti_contorno colore_contorno -appendbeep
endif 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;endif matrice_nuova (i-1,j) == colore_vecchio
matrice_nuova (i-1,j) = colore_nuovo;
finito = 0;endif matrice_nuova (i,j+1) == colore_vecchio
matrice_nuova (i,j+1) = colore_nuovo;
finito = 0;endif matrice_nuova (i,j-1) == colore_vecchio
matrice_nuova (i,j-1) = colore_nuovo;
finito = 0;endendendendend% matrice_nuova (indices) = colore;x_old = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
endif 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 = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
endif 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 = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
endif 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 = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
endif 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 = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
endif 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 = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
endif 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 = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
endif 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 = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
endif 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 = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
endif 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 = xlimy_old = ylimimagesc(matrice_nuova)
xlim(x_old);
ylim(y_old);
endif 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]) ;
endif 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]) ;
endif 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]) ;
endif 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_nuovaglobal hTextglobal passoload matrice_nuova_senza_zeri matrice_nuovamassimo = max(matrice_nuova(:))
[larg,lung] = size (matrice_nuova)
numero_colori = 0imagesc(matrice_nuova)
impixelinfo
passo = 1.4axis 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_nuovaclcbeep
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_nuovasave 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_nuovaglobal hTextglobal passoload matrice_contornomatrice_nuova = matrice_contorno;
massimo = max(matrice_nuova(:))
[larg,lung] = size (matrice_nuova)
numero_colori = 0imagesc(matrice_nuova)
impixelinfo
passo = 1.4
