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.
  1.  
  2. % Autori
  3. % Prof. Danilo Pasquini IPSIA Parodi Delfino, Colleferro (Roma)
  4. % Prof. Paolo Sordi IPSIA A. Pacinotti, Pontedera (Pisa) 
  5.  
  6. function varargout = edita_immagine(varargin)
  7. gui_Singleton = 1;
  8. gui_State = struct('gui_Name',       mfilename, ...
  9.                    'gui_Singleton',  gui_Singleton, ...
  10.                    'gui_OpeningFcn', @edita_immagine_OpeningFcn, ...
  11.                    'gui_OutputFcn',  @edita_immagine_OutputFcn, ...
  12.                    'gui_LayoutFcn',  [] , ...
  13.                    'gui_Callback',   []);
  14. if nargin && ischar(varargin{1})
  15.     gui_State.gui_Callback = str2func(varargin{1});
  16. end
  17.  
  18. if nargout
  19.     [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
  20. else
  21.     gui_mainfcn(gui_State, varargin{:});
  22. end
  23. % End initialization code - DO NOT EDIT
  24.  
  25.  
  26. % --- Executes just before edita_immagine is made visible.
  27. function edita_immagine_OpeningFcn(hObject, eventdata, handles, varargin)
  28. % This function has no output args, see OutputFcn.
  29. % hObject    handle to figure
  30. % eventdata  reserved - to be defined in a future version of MATLAB
  31. % handles    structure with handles and user data (see GUIDATA)
  32. % varargin   command line arguments to edita_immagine (see VARARGIN)
  33.  
  34. % Choose default command line output for edita_immagine
  35. handles.output = hObject;
  36.  
  37. % Update handles structure
  38. guidata(hObject, handles);
  39.  
  40. % UIWAIT makes edita_immagine wait for user response (see UIRESUME)
  41. % uiwait(handles.figure1);
  42.  
  43.  
  44. % --- Outputs from this function are returned to the command line.
  45. function varargout = edita_immagine_OutputFcn(hObject, eventdata, handles) 
  46. % varargout  cell array for returning output args (see VARARGOUT);
  47. % hObject    handle to figure
  48. % eventdata  reserved - to be defined in a future version of MATLAB
  49. % handles    structure with handles and user data (see GUIDATA)
  50.  
  51. % Get default command line output from handles structure
  52. varargout{1} = handles.output;
  53.  
  54.  
  55. % --- Executes on key press over figure1 with no controls selected.
  56. function figure1_KeyPressFcn(hObject, eventdata, handles)
  57. % hObject    handle to figure1 (see GCBO)
  58. % eventdata  reserved - to be defined in a future version of MATLAB
  59. % handles    structure with handles and user data (see GUIDATA)
  60. global matrice_nuova
  61. global colore
  62. global passo
  63. save matrice_ausiliaria matrice_nuova
  64. if isequal(get(hObject,'CurrentKey'),'m')
  65.     beep
  66.     coord = ceil(get(gca,'CurrentPoint'))
  67.     whos
  68.     matrice_nuova (coord(1,2),coord(1,1))=0;
  69.     get(handles.axes1)
  70. end  
  71. if isequal(get(hObject,'CurrentKey'),'c')
  72.     coord = (get(gca,'CurrentPoint')) + 0.5
  73.     coord = floor(coord)
  74.     colore = matrice_nuova (coord(1,2),coord(1,1));
  75. end 
  76. if isequal(get(hObject,'CurrentKey'),'v')
  77.     coord = (get(gca,'CurrentPoint')) + 0.5
  78.     coord = floor(coord)
  79.     matrice_nuova (coord(1,2),coord(1,1)) =colore;
  80.     x_old = xlim
  81.     y_old = ylim
  82.     imagesc(matrice_nuova)
  83.     xlim(x_old);
  84.     ylim(y_old);
  85. %      
  86. end 
  87. if isequal(get(hObject,'CurrentKey'),'b')
  88.  
  89.     coord = (get(gca,'CurrentPoint')) + 0.5
  90.     coord = floor(coord)
  91.  
  92.     indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
  93.     matrice_nuova (indices) = colore;
  94.  
  95.     x_old = xlim
  96.     y_old = ylim
  97.     imagesc(matrice_nuova)
  98.     xlim(x_old);
  99.     ylim(y_old);
  100. end 
  101. if isequal(get(hObject,'CurrentKey'),'+')
  102.     coord = (get(gca,'CurrentPoint')) + 0.5
  103.     coord = floor(coord)
  104.     colore_nuovo = max(matrice_nuova(:)) + 1
  105.  
  106.     indices = find(matrice_nuova ~= matrice_nuova (coord(1,2),coord(1,1)));
  107.     matrice_nuova (indices) = colore_nuovo;
  108.  
  109.     x_old = xlim
  110.     y_old = ylim
  111.     imagesc(matrice_nuova)
  112.     xlim(x_old);
  113.     ylim(y_old);
  114.  
  115. end 
  116.  
  117. %--------------------------------------------------------------------------
  118. %--------------------------------------------------------------------------
  119. %--------------------------------------------------------------------------
  120.  
  121. if isequal(get(hObject,'CurrentKey'),'g')
  122.     beep
  123.     [larg,lung] = size (matrice_nuova);
  124.     coord = (get(gca,'CurrentPoint')) + 0.5;
  125.     coord = floor(coord);
  126.     colore_nuovo = max(matrice_nuova(:)) + 1
  127.  
  128.     i1 = coord(1,2);
  129.     j1 = coord(1,1);
  130.     colore_vecchio = matrice_nuova (i1,j1);
  131.     matrice_nuova (i1,j1) = colore_nuovo;
  132.     finito = 0;
  133.     while finito == 0
  134.         finito = 1; 
  135.         for i  = 1:larg
  136.             for j =1:lung
  137.  
  138.                 if matrice_nuova (i,j) == colore_nuovo
  139.                     if matrice_nuova (i+1,j) == colore_vecchio 
  140.                         matrice_nuova (i+1,j) = colore_nuovo;
  141.                         finito = 0;
  142.                     end
  143.                     if matrice_nuova (i-1,j) == colore_vecchio 
  144.                         matrice_nuova (i-1,j) = colore_nuovo;
  145.                         finito = 0;
  146.                     end
  147.                     if matrice_nuova (i,j+1) == colore_vecchio 
  148.                         matrice_nuova (i,j+1) = colore_nuovo;
  149.                         finito = 0;
  150.                     end
  151.                     if matrice_nuova (i,j-1) == colore_vecchio 
  152.                         matrice_nuova (i,j-1) = colore_nuovo;
  153.                         finito = 0;
  154.                     end
  155.  
  156.                 end
  157.             end
  158.         end
  159.     end
  160.     colore_contorno = colore_nuovo +1   
  161.     for i  = 1:larg
  162.         for j =1:lung
  163.  
  164.             if matrice_nuova (i,j) == colore_nuovo
  165.                 if matrice_nuova (i+1,j) ~=  colore_nuovo && matrice_nuova (i+1,j) ~=  colore_contorno
  166.                     matrice_nuova (i,j) = colore_contorno;
  167.                     finito = 0;
  168.                 end
  169.                 if matrice_nuova (i-1,j) ~=  colore_nuovo && matrice_nuova (i-1,j) ~=  colore_contorno
  170.                     matrice_nuova (i,j) = colore_contorno;
  171.                     finito = 0;
  172.                 end
  173.                 if matrice_nuova (i,j+1) ~=  colore_nuovo && matrice_nuova (i,j+1) ~=  colore_contorno
  174.                     matrice_nuova (i,j) = colore_contorno;
  175.                     finito = 0;
  176.                 end
  177.                 if matrice_nuova (i,j-1) ~=  colore_nuovo && matrice_nuova (i,j-1) ~=  colore_contorno
  178.                     matrice_nuova (i,j) = colore_contorno;
  179.                     finito = 0;
  180.                 end
  181.  
  182.             end
  183.         end
  184.     end
  185. %    matrice_nuova (indices) = colore;
  186.     x_old = xlim
  187.     y_old = ylim
  188.     imagesc(matrice_nuova)
  189.     xlim(x_old);
  190.     ylim(y_old);
  191.     [y,x,v]= find(matrice_nuova==colore_contorno);
  192.     save punti_contorno x
  193.     save punti_contorno y -append
  194.     save punti_contorno v -append
  195.     save punti_contorno matrice_nuova -append
  196.     save punti_contorno colore_contorno -append
  197.     beep
  198. end
  199. if isequal(get(hObject,'CurrentKey'),'r')
  200.     [larg,lung] = size (matrice_nuova);
  201.     coord = (get(gca,'CurrentPoint')) + 0.5;
  202.     coord = floor(coord);
  203.     colore_nuovo = max(matrice_nuova(:)) + 1
  204.  
  205.     i1 = coord(1,2);
  206.     j1 = coord(1,1);
  207.     colore_vecchio = matrice_nuova (i1,j1);
  208.     matrice_nuova (i1,j1) = colore_nuovo;
  209.     finito = 0;
  210.     while finito == 0
  211.         finito = 1; 
  212.         for i  = 1:larg
  213.             for j =1:lung
  214.  
  215.                 if matrice_nuova (i,j) == colore_nuovo
  216.                     if matrice_nuova (i+1,j) == colore_vecchio 
  217.                         matrice_nuova (i+1,j) = colore_nuovo;
  218.                         finito = 0;
  219.                     end
  220.                     if matrice_nuova (i-1,j) == colore_vecchio 
  221.                         matrice_nuova (i-1,j) = colore_nuovo;
  222.                         finito = 0;
  223.                     end
  224.                     if matrice_nuova (i,j+1) == colore_vecchio 
  225.                         matrice_nuova (i,j+1) = colore_nuovo;
  226.                         finito = 0;
  227.                     end
  228.                     if matrice_nuova (i,j-1) == colore_vecchio 
  229.                         matrice_nuova (i,j-1) = colore_nuovo;
  230.                         finito = 0;
  231.                     end
  232.  
  233.                 end
  234.             end
  235.         end
  236.     end
  237.  
  238. %    matrice_nuova (indices) = colore;
  239.     x_old = xlim
  240.     y_old = ylim
  241.     imagesc(matrice_nuova)
  242.     xlim(x_old);
  243.     ylim(y_old);
  244.  
  245. end 
  246.  
  247.  
  248. if isequal(get(hObject,'CurrentKey'),'1')
  249.     coord = (get(gca,'CurrentPoint')) + 0.5
  250.     coord = floor(coord)
  251.     indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
  252.     matrice_nuova (indices) = 1;
  253.     x_old = xlim
  254.     y_old = ylim
  255.     imagesc(matrice_nuova)
  256.     xlim(x_old);
  257.     ylim(y_old);
  258. end 
  259.  
  260. if isequal(get(hObject,'CurrentKey'),'2')
  261.     coord = (get(gca,'CurrentPoint')) + 0.5
  262.     coord = floor(coord)
  263.     indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
  264.     matrice_nuova (indices) = 2;
  265.     x_old = xlim
  266.     y_old = ylim
  267.     imagesc(matrice_nuova)
  268.     xlim(x_old);
  269.     ylim(y_old);
  270. end
  271. if isequal(get(hObject,'CurrentKey'),'3')
  272.     coord = (get(gca,'CurrentPoint')) + 0.5
  273.     coord = floor(coord)
  274.     indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
  275.     matrice_nuova (indices) = 3;
  276.     x_old = xlim
  277.     y_old = ylim
  278.     imagesc(matrice_nuova)
  279.     xlim(x_old);
  280.     ylim(y_old);
  281. end
  282. if isequal(get(hObject,'CurrentKey'),'4')
  283.     coord = (get(gca,'CurrentPoint')) + 0.5
  284.     coord = floor(coord)
  285.     indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
  286.     matrice_nuova (indices) = 4;
  287.     x_old = xlim
  288.     y_old = ylim
  289.     imagesc(matrice_nuova)
  290.     xlim(x_old);
  291.     ylim(y_old);
  292. end
  293. if isequal(get(hObject,'CurrentKey'),'5')
  294.     coord = (get(gca,'CurrentPoint')) + 0.5
  295.     coord = floor(coord)
  296.     indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
  297.     matrice_nuova (indices) = 5;
  298.     x_old = xlim
  299.     y_old = ylim
  300.     imagesc(matrice_nuova)
  301.     xlim(x_old);
  302.     ylim(y_old);
  303. end
  304. if isequal(get(hObject,'CurrentKey'),'6')
  305.     coord = (get(gca,'CurrentPoint')) + 0.5
  306.     coord = floor(coord)
  307.     indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
  308.     matrice_nuova (indices) = 6;
  309.     x_old = xlim
  310.     y_old = ylim
  311.     imagesc(matrice_nuova)
  312.     xlim(x_old);
  313.     ylim(y_old);
  314. end 
  315. if isequal(get(hObject,'CurrentKey'),'7')
  316.     coord = (get(gca,'CurrentPoint')) + 0.5
  317.     coord = floor(coord)
  318.     indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
  319.     matrice_nuova (indices) = 7;
  320.     x_old = xlim
  321.     y_old = ylim
  322.     imagesc(matrice_nuova)
  323.     xlim(x_old);
  324.     ylim(y_old);
  325. end 
  326. if isequal(get(hObject,'CurrentKey'),'8')
  327.     coord = (get(gca,'CurrentPoint')) + 0.5
  328.     coord = floor(coord)
  329.     indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
  330.     matrice_nuova (indices) = 8;
  331.     x_old = xlim
  332.     y_old = ylim
  333.     imagesc(matrice_nuova)
  334.     xlim(x_old);
  335.     ylim(y_old);
  336. end 
  337. if isequal(get(hObject,'CurrentKey'),'n')
  338.     coord = (get(gca,'CurrentPoint')) + 0.5
  339.     coord = floor(coord)
  340.     indices = find(matrice_nuova == matrice_nuova (coord(1,2),coord(1,1)));
  341.     matrice_nuova (indices) = 204;
  342.     x_old = xlim
  343.     y_old = ylim
  344.     imagesc(matrice_nuova)
  345.     xlim(x_old);
  346.     ylim(y_old);
  347. end 
  348. if isequal(get(hObject,'CurrentKey'),'q') % ingrandisce
  349.     beep
  350.     coord = (get(gca,'CurrentPoint')) + 0.5;
  351.     coord = floor(coord);
  352.     x_old = xlim .* passo;
  353.     y_old = ylim .* passo;
  354.     xlim ([coord(1,1)- (x_old(2)-x_old(1)) / 2, coord(1,1)+(x_old(2)-x_old(1)) / 2]) ;
  355.     ylim ([coord(1,2)- (y_old(2)-y_old(1)) / 2, coord(1,2)+(y_old(2)-y_old(1)) / 2]) ;
  356. end 
  357. if isequal(get(hObject,'CurrentKey'),'w') % rimpicciolisce
  358.     beep
  359.     coord = (get(gca,'CurrentPoint')) + 0.5;
  360.     coord = floor(coord);
  361.     x_old = xlim ./ passo;
  362.     y_old = ylim ./ passo;
  363.     xlim ([coord(1,1)- (x_old(2)-x_old(1)) / 2, coord(1,1)+(x_old(2)-x_old(1)) / 2]) ;
  364.     ylim ([coord(1,2)- (y_old(2)-y_old(1)) / 2, coord(1,2)+(y_old(2)-y_old(1)) / 2]) ;
  365. end 
  366.  
  367. if isequal(get(hObject,'CurrentKey'),'p') % pan
  368.     beep
  369.     coord = (get(gca,'CurrentPoint')) + 0.5;
  370.     coord = floor(coord);
  371.     x_old = xlim ;
  372.     y_old = ylim ;
  373.     xlim ([coord(1,1)- (x_old(2)-x_old(1)) / 2, coord(1,1)+(x_old(2)-x_old(1)) / 2]) ;
  374.     ylim ([coord(1,2)- (y_old(2)-y_old(1)) / 2, coord(1,2)+(y_old(2)-y_old(1)) / 2]) ;
  375. end 
  376. if isequal(get(hObject,'CurrentKey'),'e')
  377.     xlim('auto') 
  378.     ylim('auto') 
  379.  
  380. end 
  381.  
  382.  
  383. % --- Executes on button press in pushbutton1.
  384. function pushbutton1_Callback(hObject, eventdata, handles)
  385. % hObject    handle to pushbutton1 (see GCBO)
  386. % eventdata  reserved - to be defined in a future version of MATLAB
  387. % handles    structure with handles and user data (see GUIDATA)
  388. global matrice_nuova
  389. global hText
  390. global passo
  391. load matrice_nuova_senza_zeri matrice_nuova
  392. massimo = max(matrice_nuova(:))
  393. [larg,lung] = size (matrice_nuova)
  394. numero_colori = 0
  395. imagesc(matrice_nuova)
  396. impixelinfo
  397. passo = 1.4
  398. axis equal
  399.  
  400.  
  401. % --- Executes on mouse press over figure background.
  402. function figure1_ButtonDownFcn(hObject, eventdata, handles)
  403. % hObject    handle to figure1 (see GCBO)
  404. % eventdata  reserved - to be defined in a future version of MATLAB
  405. % handles    structure with handles and user data (see GUIDATA)
  406. beep
  407.  
  408.  
  409. % --- Executes on mouse press over axes background.
  410. function axes1_ButtonDownFcn(hObject, eventdata, handles)
  411. % hObject    handle to axes1 (see GCBO)
  412. % eventdata  reserved - to be defined in a future version of MATLAB
  413. % handles    structure with handles and user data (see GUIDATA)
  414. global matrice_nuova
  415. clc
  416. beep
  417. coord = ceil(get(gca,'CurrentPoint'))
  418. matrice_nuova (coord(1,2),coord(1,1))=0;
  419. image(matrice_nuova)
  420. drawnow
  421.  
  422.  
  423.  
  424. % --- Executes on button press in pushbutton2.
  425. function pushbutton2_Callback(hObject, eventdata, handles)
  426. % hObject    handle to pushbutton2 (see GCBO)
  427. % eventdata  reserved - to be defined in a future version of MATLAB
  428. % handles    structure with handles and user data (see GUIDATA)
  429. global matrice_nuova
  430. save matrice_finita matrice_nuova
  431.  
  432.  
  433. % --- Executes on button press in pushbutton3.
  434. function pushbutton3_Callback(hObject, eventdata, handles)
  435. % hObject    handle to pushbutton3 (see GCBO)
  436. % eventdata  reserved - to be defined in a future version of MATLAB
  437. % handles    structure with handles and user data (see GUIDATA)
  438. impixelinfo
  439.  
  440.  
  441.  
  442. % --- Executes on button press in pushbutton4.
  443. function pushbutton4_Callback(hObject, eventdata, handles)
  444. % hObject    handle to pushbutton4 (see GCBO)
  445. % eventdata  reserved - to be defined in a future version of MATLAB
  446. % handles    structure with handles and user data (see GUIDATA)
  447.  
  448. global matrice_nuova
  449. global hText
  450. global passo
  451. load matrice_contorno
  452. matrice_nuova  = matrice_contorno;
  453. massimo = max(matrice_nuova(:))
  454. [larg,lung] = size (matrice_nuova)
  455. numero_colori = 0
  456. imagesc(matrice_nuova)
  457. impixelinfo
  458. passo = 1.4