影像處理概論-期末專題報告 題目:圖片文字消除 影像處理概論-期末專題報告 題目:圖片文字消除 指導老師:謝政勳 老師 組 員: 9627053 廖騰翔 9627065 高健皓 9627146 古思遠
大綱 一、簡介 二、系統操作步驟流程圖 三、程式碼與對應步驟 四、實驗結果與討論 五、結語
一、簡介 背景: 為了因應想將圖片上不需要的文字消除,並保留其原本圖像之完整度的人,故設計了此系統。 使用方法: 使用的方法有灰階、區域選取、選取區域擷取、中值濾波,用中值濾波的原因是因大部分影像上的文字都與背景的顏色差異甚大,故用中值濾波將差異較大的顏色排除,以達到我們所需要的結果。
目標: 希望能做到將文字消除之後,能讓被 中值濾波處理過的背景藉由周圍未被 中值濾波處理的圖像進行採樣還原, 以達到消除文字並恢復圖片的完整度 。
二、系統操作步驟流程圖 Open-開啟檔案 Medfilt-中值濾波 預設遮罩3x3 可選擇遮罩7x7 5x5 3x3 Rect-選取範圍 Crop-切割選取範圍 Rgb2gray-灰階化 Medfilt-中值濾波 預設遮罩3x3 可選擇遮罩7x7 5x5 3x3 Rect-選取範圍 在已選取範圍 內點2下抓取 position
三、程式碼與對應步驟 function varargout = gui2(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @gui2_OpeningFcn, ... 'gui_OutputFcn', @gui2_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{:});
程式碼 function gui2_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); set(handles.Open_text,'string','開啟檔案,檔案類型為jpeg,jpg,bmp,png,git,tif'); set(handles.Save_text,'string','儲存檔案,檔案類型為jpeg,jpg,bmp,png,git,tif'); set(handles.rgb2gray_text,'string','將讀入的影像做灰階化並顯示'); set(handles.rect_text,'string','選擇想要的範圍,選取完後請在選取框框內點兩下'); set(handles.crop_text,'string','對rect取出來的座標使用crop截取圖片'); set(handles.medfilt_text,‘string’,‘對用crop取出來的圖做中值濾波’); set(handles.mednxn_text,'string','改變medfilt的遮罩大小,預設為3x3'); set(handles.write_text,‘string’,‘將修改好的圖片寫入原圖'); set(handles.msg_text,'string',''); global n global position global act %act系統尚未完成 global map global map2 map=[0]; map2=[0]; act=0; position=[0 0 0 0]; n=3;
程式碼 Open開始檔案 function Open_Callback(hObject, eventdata, handles) global act %The fcn act=1 global map [filename,pathname]=uigetfile('*.jpeg;*.jpg;*.bmp;*.png;*.gif;*.tif'); fullpath=strcat(pathname,filename); if ~isequal([filename,pathname],[0,0]) map=imread(fullpath); axes(handles.axes1); imshow(map); act=1; set(handles.msg_text,'string',''); end
程式碼 Save儲存檔案 function Save_Callback(hObject, eventdata, handles) global act %The fcn act=2 global map if (mod(act,2)==1) [filename,pathname] = uiputfile({'*.jpg';'*.bmp';'*.png';'*.gif';'*.tif'}); if (act<32) if ~isequal([filename,pathname],[0,0]) set(handles.msg_text,'string',''); filefullname=[pathname filename]; imwrite(map,filefullname,'jpg'); end elseif (act>32) imwrite(map2,filefullname,'jpg'); else set(handles.msg_text,'string','你還沒開啟影像');
程式碼 Rgb2gray灰階化 function rgb2gray_Callback(hObject, eventdata, handles) global act %The fcn act=4 global map global map2 if (mod(act,2)==1) set(handles.msg_text,'string',''); map2=rgb2gray(map); imshow(map2); if act<5 act=act+4; end else set(handles.msg_text,'string','你還沒開啟影像');
程式碼 Rect選取範圍 function rect_Callback(hObject, eventdata, handles) global act %The fcn act=8 global position global h if act>8 h=[0 0 0 0]; position=[0 0 0 0]; end if (mod(act,2)==1) set(handles.msg_text,'string',''); h = imrect; if act<8 act=act+8; position = wait(h); else set(handles.msg_text,'string','你還沒開啟影像');
程式碼 Crop分割影像 function crop_Callback(hObject, eventdata, handles) global act %The fcn act=16 global map global map2 global map3 global h global position if (mod(act,2)==1) if (act<8) set(handles.msg_text,'string','你還沒用rect選取範圍'); elseif (position==[0 0 0 0]) set(handles.msg_text,'string','你還沒在rect選取的範圍內點兩下'); elseif (act==9) set(handles.msg_text,'string',''); map3=imcrop(map,position); axes(handles.axes2); imshow(map3); elseif (act==13) map3=imcrop(map2,position); end else set(handles.msg_text,'string','你還沒開啟影像');
程式碼 中值濾波預設3*3 function medfilt_Callback(hObject, eventdata, handles) global act %The fcn act=32 global map3 global n if (mod(act,2)==1) if (act==9) set(handles.msg_text,'string',''); map3=medfilt2(map3,[n n]); axes(handles.axes2); imshow(map3); act=act+32; elseif (act==13 | act==41) end else set(handles.msg_text,'string','你還沒開啟影像');
程式碼 中值濾波可設定遮罩大小 3*3部分 function med3x3_Callback(hObject, eventdata, handles) global act global n n=3; 5*5部分 function med5x5_Callback(hObject, eventdata, handles) n=5 7*7部分 function med7x7_Callback(hObject, eventdata, handles) n=7;
程式碼 修改好的圖寫入原圖 global act %The fcn act=64 global map2 global map4 global position if (act<32) ii=0; jj=0; x=round(position(1)); y=round(position(2)); xL=round(position(3)+x); yL=round(position(4)+y); for i=x:xL ii=ii+1; for j=y:yL jj=jj+1; map2(j,i)=map4(jj+50,ii+50); end axes(handles.axes1); imshow(map2); act=act+64;
四、實驗結果 在程式碼與對應步驟的部分已經看到了,文字部分確實能用中值濾波進行處理且消除,但處理完的圖片難免會有變模糊的問題,且該如何對圖片周圍進行採樣並還原並不如原本預期的簡單,若只進行簡單的方法只會讓圖像產生不協調感。
討論 目前的瓶頸在於擷取的圖片做完中值濾波直接寫入原圖會造成影像不協調,但不知道如何對擷取圖片周圍作採樣進行復原,雖然能夠寫入但卻不符合我們的需求。
五、結語 在編寫本次的系統中發現,影像處理的方面並不如想像中的簡單,反而是非常的困難,而且有著許多的限制存在。 本系統編寫完成度大概連50%都不到,就算做到了消除文字卻也完全沒辦法使用,若無法克服恢復圖像的問題本系統就完全不算完成,將來應該會持續將本系統繼續做到完整。