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吧……實在不行咱一點點調嘛。
![](http://i1.wp.com/pic4.zhimg.com/50/v2-e4864eebc6d91d3012459b3522927da7_720w.webp)
篩選圖片白色
將所有像素的灰度值計算出來。這裡,灰度是用來判斷「白」和「黑」的工具,當灰度大於某一值,我們認為其應該為白色,將該像素完全修改為白色。其餘顏色不予改動。
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
文件處理效果如下:
![](http://i1.wp.com/pic3.zhimg.com/50/v2-0d4fbeb7e153b5624cae9142ebb6f286_720w.webp)
推薦閱讀:
TAG:MATLAB |