標籤:

20+行Matlab代碼實現文件掃描

最近剛好看到一篇回答,用閾值二值化

處理圖片水印,受到啟發寫此代碼。閾值二值化適合處理只有黑白兩色的圖片,考慮到文件蓋章,這裡作者使用像素顏色替換及灰度值處理圖片,進一步提高處理精度和能力。

我們需要:Matlab軟體,手機拍的文件圖片

2019.2.22修改:根據評論區建議,刪除循環,將代碼全部矩陣化

首先讀入圖片

filename=TestPic.jpg;%圖片名稱,默認與代碼在同一文件夾下
img=imread(filename);%讀入圖片

獲取圖片RGB值

R=img(:,:,1);
G=img(:,:,2);
B=img(:,:,3);

篩選圖片紅色

red=(R>=100).*(R<=255).*(G<110).*(B<110);%判斷是否為紅色並得到紅色區域布爾矩陣
%這裡的.*為矩陣元素各自相乘,直接使用*為矩陣乘法
%這裡偷了個懶,乘法在這裡的作用是矩陣相與

%修改紅色區域顏色
R(red==1)=255;
G(red==1)=70;
B(red==1)=70;

這裡,RGB數值不唯一,可以根據具體圖片重新調整,特別是識別紅色的if語句,需要反覆調參。這裡作者事先在PS里查看了原圖紅色區域RGB數值。如果你不會PS,那……總有別的辦法搞到RGB吧……實在不行咱一點點調嘛。

在PS中查看像素RGB值

篩選圖片白色

將所有像素的灰度值計算出來。這裡,灰度是用來判斷「白」和「黑」的工具,當灰度大於某一值,我們認為其應該為白色,將該像素完全修改為白色。其餘顏色不予改動。

gray=R.*0.299+G.*0.587+B.*0.114;%灰度值計算,得到灰度值矩陣
white=(gray>120)-red;%將灰度中的紅色區域剔除,得到白色矩陣

%將白色區域完全變白
R(white==1)=255;
G(white==1)=255;
B(white==1)=255;

ps:這樣做的好處之一是,只讓白的地方更白,其他比較複雜的區域未作改變,圖片不至於偏離事實。

顏色覆蓋

這裡我們將之前轉換好的RGB圖層全部賦值給res變數,res變數即最終結果。

res(:,:,1)=R(:,:);
res(:,:,2)=G(:,:);
res(:,:,3)=B(:,:);

圖片保存

imwrite(res,stripes2.png);%保存圖片

至此,這20行代碼已經能自動將你手機拍的圖片轉換為「掃描文件」了

需要注意的是,拍攝圖片的時候最好在文件正上方,拍完有條件地話可以裁剪一下,這些手機自帶的軟體都可以搞定。

全部完整代碼如下:

clc;
clear all;
filename=TestPic.jpg;%圖片名稱,默認與代碼在同一文件夾下
img=imread(filename);%讀入圖片
%獲取RGB圖層
R=img(:,:,1);
G=img(:,:,2);
B=img(:,:,3);

red=(R>=100).*(R<=255).*(G<110).*(B<110);%判斷是否為紅色並得到紅色區域布爾矩陣
%這裡的.*為矩陣元素各自相乘,直接使用*為矩陣乘法
%這裡偷了個懶,乘法在這裡的作用是矩陣相與

%修改紅色區域顏色
R(red==1)=255;
G(red==1)=70;
B(red==1)=70;

gray=R.*0.299+G.*0.587+B.*0.114;%灰度值計算,得到灰度值矩陣
white=(gray>120)-red;%將灰度中的紅色區域剔除,得到白色矩陣

%將白色區域完全變白
R(white==1)=255;
G(white==1)=255;
B(white==1)=255;

disp(轉換結束);

res(:,:,1)=R(:,:);
res(:,:,2)=G(:,:);
res(:,:,3)=B(:,:);

imwrite(res,stripes2.png);%保存圖片
disp(圖片已保存);

原圖是我在網上隨便找的一張,作者使用的軟體是Matlab R2016a

文件處理效果如下:


推薦閱讀:

TAG:MATLAB |