(一)matlab官方交互式学习网址(2小时):
Self-Paced Online CoursesLearn MATLAB for free with MATLAB Onramp and access interactive self-paced online courses and tutorials on Deep Learning, Machine Learning and more.https://matlabacademy.mathworks.com/details/image-processing-onramp/imageprocessing
(二)讲解的主要几个部分:
(三)目录
目录
一、学习说明
二、主要内容
(一)在MATLAB中处理图像:导入、显示和操作彩色和灰度图像。
1、将图像导入Matlab
2、灰色图像和彩色图像
3、对比度调整
4、以交互方式处理图像
(二)分割图像:通过阈值强度值创建二值图像。
1、课程示例—收据照片
2、什么是分割Segment
3、强度阈值Intensity Thresholding
4、使用二值图像
(三)预处理和后处理技术:使用常见的预处理和后处理技术改进图像分割。
1、改善细分:包括过滤噪音、背景分离、二元形态学等。
2、过滤噪音:从图像中去除噪点。
3、背景分离
4、二元形态学
(四)分类和批处理:设计一个指标来对图像进行分类,并将该指标应用于一组图像文件。
1、设计收据检测指标
2、使用图像数据存储进行批处理
3、课程示例 - 提取包含收据的图像
三、word版本下载地址
功能 |
代码 |
1、导入图像 |
A = imread("imgFile.jpg"); |
2、显示图像 |
imshow(A) |
3、同时显示两张图像 |
imshowpair(A1,A2,"montage") |
4、存储图像 |
imwrite(imgData,"img.jpg") |
功能 |
代码 |
5、查看图像的大小 |
sz = size(A) |
6、提取颜色平面(1-R;2-G;3-B) |
Ig = I(:,:,2); |
7、同时提起三种颜色平面 |
[R,G,B] = imsplit(A); |
8、同时呈现三种颜色平面 |
montage({R,G,B}) |
9、提取最大像素值 |
Amax = max(A,[],"all") |
10、提取最小像素值 |
Amin = min(A,[],"all") |
11、从彩色图像转化成灰度图像 |
Ags = im2gray(A); |
功能 |
代码 |
12、强度直方图 |
imhist(I) |
13、自动调整灰度图像的对比度 |
Aadj = imadjust(A); |
14、自动调整彩色图像的对比度 |
I2adj = imlocalbrighten(I2); |
在命令窗口输入imtool,或者在APPS里面找到mage viewer(图片查看器)就可以打开图片操作了。(注:安装了Image Processing Toolbox才能用)
从灰度图像创建二值黑白图像。低于阈值的值被赋值0,而高于阈值的值被赋值1,从而把图像进行分割。
功能 |
代码 |
15、人为设定阈值创建二值图像 |
B = g > thresh; |
16、自动选择阈值创建二值图像 |
gBinary = imbinarize(g); |
17、局部最佳阈值 |
gBinary = imbinarize(g,"adaptive"); |
18、前景设置 |
gBinary=imbinarize(g,"adaptive","ForegroundPolarity","dark") |
注:
A、第15步,thresh的设定可以通过看g的直方图来确定和调整。
B、第17步,默认情况下,imbinarize使用全局阈值——图像中每个像素的阈值相同。通过将“自适应”选项作为第二个参数传递给imbinarize,可以让imbinarize查看图像的较小部分,并为该区域选择最佳阈值。
C、默认情况下,假定图像的前景为亮,背景为暗。但对于收据来说,前景是深色文本,背景是明亮的。所以这里要进行第18步的调整。
原则:如果对每一行的值求和,则有文本的行的总和将小于没有文本的行。
功能 |
代码 |
19、计算数组中各行的和 |
rSum = sum(BW,2) |
20、画出各行的和的图 |
Plot(rSum) |
功能 |
代码 |
21、设计n×n均值滤波器 |
F = fspecial("average",n) |
22、进行滤波处理 |
Ifltr = imfilter(I,F); |
23、更改图像外部像素 |
Ifltr = imfilter(I,F,"replicate"); |
注:第23步,imfilter的默认设置将图像外的像素设置为零,要调整此行为,请使用“replicate”选项,“replicate”选项使用图像边界上的像素强度值来表示图像外部的像素,而不是零。
在收据图像中,背景是非文本的任何东西,因此隔离背景可以解释为删除文本。从图像中删除文本的一种方法是使用形态学操作:开运算和闭运算。
功能 |
代码 |
24、创建结构元素 |
SE = strel("diamond",5) 或SE = strel("disk",8) |
25、闭运算 |
Iclosed = imclose(I,SE); |
26、图像相减 |
Isub = I2 - I1; |
27、图像反转 |
~ |
28、底帽变换bottom hat transform |
BW = imbothat(gs,SE); |
注:
A、第25步,前景(文本)是暗的,背景是亮的。关闭图像将突出并连接较亮的背景,删除较薄的深色字体。要隔离背景,您需要通过强调明亮区域来消除暗文本。为此,使用imclose关闭图像。最终的结果是:没有文本的背景图像。
B、第26步,因为背景图像Ibg的强度高于gs。从gs中减去Ibg将导致负强度。为了避免负强度,从Ibg中减去gs。
C、第26步中的减法将强度反转,因此文本显示为白色,背景显示为黑色。要恢复原始顺序,需要再次反转图像,进行第27步。
D、关闭图像,然后从关闭的图像中减去原始图像。它被称为“底帽变换”,通过第28步实现。也就是说28=25+26。
#背景分离完整的案例代码:
I = imread("IMG_001.jpg"); #读取图像
gs = im2gray(I); #将彩色图像变成灰度图像
gs = imadjust(gs); #对比度调整
H = fspecial("average",3); #设置3*3均值滤波
gs = imfilter(gs,H,"replicate"); #用均值滤波去除噪声
BW = imbinarize(gs,"adaptive","ForegroundPolarity","dark"); #创建二值图像
imshowpair(gs,BW,"montage") #共同显示
SE = strel("disk",8) #创建结构元素
#第一种方式
Ibg = imclose(gs,SE); #闭运算,得到没有文本的背景图像
imshow(Ibg)
gsSub=Ibg-gs #图像相减
imshow(gsSub)
BWsub=~imbinarize(gsSub) #创建二值图像并进行图像反转
imshow(BWsub)
#第二种方式
BW = imbothat(gs,SE);
imshow(BW)
BWsub=~imbinarize(BW)
imshow(BWsub)
形态学操作不仅可用于从图像中删除特征,还可用于增强特征。可以使用形态学来增强二值图像中的文本并改善行和信号。形态开口扩大了深色文本区域,而闭合则减少了它们。增加结构元素的大小会增加这些效果。
功能 |
代码 |
29、创建矩形结构元素,其大小数组的格式为[height width] |
SE = strel("rectangle",[10 20]); |
30、开运算 |
Iopened = imopen(I,SE); |
注:
A、第29步,要增强图像中的特定形状,请在要增强的形状中创建结构元素。在这里,每行文本都应该成为一条水平条纹,看起来像一个短而宽的矩形。
B、第30步,这里希望强调黑色文本,用imopen进行开运算。使用带有宽矩形结构元素的imopen将文本行转换为黑色水平条纹,从而增强行和信号中的波谷。
#二元形态学完整代码:
I = imread("IMG_002.jpg");
gs = im2gray(I);
gs = imadjust(gs);
#均值滤波去除噪声
H = fspecial("average",3);
gs = imfilter(gs,H,"replicate");
#闭运算消除背景
SEdisk = strel("disk",8);
Ibg = imclose(gs,SEdisk);
gsSub = Ibg - gs;
BW = ~imbinarize(gsSub);
imshowpair(I,BW,"montage")
#开运算进行文本信号增强
SE = strel("rectangle",[3 25]);
BWstripes = imopen(BW,SE);
imshow(BWstripes)
S=sum(BWstripes,2)
plot(S)
Sbw=sum(BW,2)
hold on
plot(Sbw)
hold off
结果图像:
注:从图中可以明显看出,经过开运算后的Sbw(红线)的波谷明显要高于原始S(蓝线)。
通常,收据图像的行和与非收据图像的行和在视觉上是不同的。空白和深色文本的交替行为接收图像产生了其他图像所没有的特征性振荡。
功能 |
代码 |
31、调用并呈现之前的结果 |
I = imread("IMG_001.jpg") [S,BW,BWstripes] =processImage(I); montage({I,BW,BWstripes}) |
32、寻找局部最小值, |
将交互式任务添加到实时脚本,实时编辑器---任务----Find Local Extrema |
33、计算行和信号中的最小值的数量 |
nMin=nnz(minIndices) |
34、定义一个将收据与非收据分开的阈值 |
isReceipt = nMin >= 9 |
注:第32步的操作如下。S表示图像1做完形态学操作后的行和,局部最小值存储在minIndices变量中。
功能 |
代码 |
35、为文件夹中的所有图像文件创建图像数据存储 |
ds = imageDatastore("localFolder") |
36、访问数据存储的属性 |
dataFilenames=ds.Files |
37、查找数组中的元素总数 |
nFiles = numel(dataFilenames) |
38、读取数据集中的图片,点击运行节会切换到下一张图片 |
img = read(ds); imshow(img) |
39、读取第三张图片 |
imgs = readall(ds); imshow(imgs{3}) 或I = readimage(ds,3); imshow(I) |
40、对图片进行分类(classifyImage函数是之前设置好的算法) |
isReceipt=classifyImage(I) |
注:第39步参考网址:
Datastore for image data - MATLAB
完整代码:
#定义分类函数classifyImage
function isReceipt = classifyImage(I)
% This function processes an image using the algorithm developed in
% previous chapters and classifies the image as receipt or non-receipt
% Processing
gs = im2gray(I);
gs = imadjust(gs);
H = fspecial("average",3);
gssmooth = imfilter(gs,H,"replicate");
SE = strel("disk",8);
Ibg = imclose(gssmooth, SE);
Ibgsub = Ibg - gssmooth;
Ibw = ~imbinarize(Ibgsub);
SE = strel("rectangle",[3 25]);
stripes = imopen(Ibw, SE);
signal = sum(stripes,2);
% Classification
minIndices = islocalmin(signal,"MinProminence",70,"ProminenceWindow",25);
nMin = nnz(minIndices);
isReceipt = nMin >= 9;
end
#读取数据进行分类
ds = imageDatastore("testimages");
nFiles = numel(ds.Files);
isReceipt = false(1,nFiles);
for k = 1:nFiles
I = readimage(ds,k);
isReceipt(k) = classifyImage(I);
end
% 注:如果要呈现非收据图片,将上述命令更改为:
% isReceipt(k) =~classifyImage(I);
#显示收据图片
receiptFiles = ds.Files(isReceipt);
montage(receiptFiles)
链接:https://pan.baidu.com/s/15jh3N1m5JwryKh9zsf915A
提取码:nzxf