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