小白 数字图像处理
2019-03-11 16:38:29 qq_35594560 阅读数 278

第一步:是否为彩色图片(假设:是)

第二步:转为灰度图像

第三步:通过灰度阀值寻找区域

第四步:通过特征点提取,提取固定区域

第五步:对提取的区域做处理,例如填充区域,膨胀,开操作等。

 

2018-05-23 08:53:52 qq_15262755 阅读数 2061

主要参考《数字图像处理 原理与实践(matlab版)》一书

用到的函数介绍:

imreconstruct()函数的功能是对图形形态修饰。

imreconstruct()书写主要格式为

IM = imreconstruct(MARKER,MASK) 

MARKER——标记,标记和掩码可以是两个灰度图像或两个二进制图像具有相同的大小。标记必须是相同的大小。

MASK——面膜,作为面膜,其元素必须小于或等于面具的相应元素

https://blog.csdn.net/qq_26460507/article/details/55192961

功能:转换标记矩阵到RGB图像

用法:RGB = label2rgb(L) 

输入:L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回) 

输出:RGB——彩色图像

注:根据L的数值对应,默认对应到colormap(jet)的色彩,返回RGB矩阵 

RGB = label2rgb(L, map)

输入:L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回)、map——颜色映射表 

输出:RGB——彩色图像

注:map为n*3的矩阵,可以通过MATLAB的colormap函数来返回,比如colormap('jet')等。也可以根据要求自己定义。默认为colormap(jet)。 

RGB = label2rgb(L, map, zerocolor) defines the RGB color of the elements labeled 0 (zero) in the input label matrix L. As the value of zerocolor, specify an RGB triple or one of the strings listed in this table.

输入:L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回)、map——颜色映射表、zerocolor——对应于标记0的颜色 

输出:RGB——彩色图像 b

注:zerocolor可以取值如表1.1,默认为[1 1 1],即白色。 

表1.1 取值列表 

 Value

Color 

 'b'

 蓝色

 'c'

 蓝绿色

 'g'

 绿色

 'k'

 黑色

 'm'

 洋红色

 'r'

 红色

 'w'

 白色

'y' 

 黄色

RGB = label2rgb(L, map, zerocolor, order) 

输入:L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回)、map——颜色映射表、zerocolor——对应于标记0的颜色、order——标记矩阵和颜色映射表对应方式
输出:RGB——彩色图像 

注:order默认为noshuffle,即根据L的数值来对应颜色。另外可以取值为shuffle,说明使用伪随机方式来对应。


https://blog.csdn.net/u012116229/article/details/44945205

可以使用MATLAB图形处理工具箱中的函数来确定图像的高亮度区域和低亮度区域。

imregionalmax函数和imregionalmin函数确定所有的极大值和极小值
imextendedmax函数和imextendedmin函数确定大于某阈值的极大值和小于某阈值的极小值
所以都是为了确定极大值和极小值。

这些函数把灰度图像作为输入参数,而把二值图像作为输出参数。在输出的二值图像中,局部极大值和局部极小值设为1,其他值设为0.

imextendedmax函数和imextendedmin函数,以imextendedmax为例,是首先将输入的阈值减去再用imregionalmax来做操作的。


https://blog.csdn.net/qing101hua/article/details/45559377

cat:用来联结数组

用法:C = cat(dim, A, B)       按dim来联结A和B两个数组。

      C = cat(dim, A1, A2, A3, ...)    按dim联结所有输入的数组。

      e.g.

      a=cat(3,A,B) 左括号后的3表示构造出的矩阵维数;在新的矩阵中第1、2维就是A和B这两个矩阵的行数和列数,第3维是A和B这两个矩阵的矩阵个数,即为2

cat(2, A, B)相当于[A, B];

cat(1, A, B)相当于[A; B].


https://www.cnblogs.com/saliency/archive/2014/03/11/3593308.html

matlab函数bwareaopen──删除小面积对象

格式:BW2 = bwareaopen(BW,P,conn)
作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域。

https://blog.csdn.net/u013228046/article/details/40651663

bwdist函数用于计算元素之间的距离。


https://blog.csdn.net/hduxiejun/article/details/53011863

imimposemin函数

bwdist函数用于计算元素之间的距离。 
功能:施加极小值 
用法:I2 = imimposemin(I,BW) 
使用形态重构修改强度图像I,使得它在BW非零的地方只有区域极小值。BW是一个二值图像,和I的尺寸相同。 
默认情况下,imimposemin对二维图像使用8连通域,对三维图像使用26连通域。对于更高维数的情况,imimposemin使用conndef(ndims(I),’minimum’)。 
I2 = imimposemin(I,BW,conn) 


https://blog.csdn.net/jiejianmin2666/article/details/78148533

Matlab中imshow()函数的使用
    问题:在使用imshow(A)显示一张灰度图片时,显示出的是一张纯白的图片。。(A为double类型的图像矩阵)
    原因:在matlab中,为了保证精度,经过了运算的图像矩阵A其数据类型会从unit8型变成double型。imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色。imshow显示uint8型时是0~255范围。
    解决:使用imshow(A,[]),即可把图像矩阵A显示为正常的灰度图像。

    原理:imshow(A,[])将A的最大值(max(A))和最小值(min(A))分别作为纯白(255)和纯黑(0),中间的K值相应地映射为0到255之间的标准灰度值,这样就可以正常显示了。。。,相当于将double型的矩阵A拉伸成为了0-255的uint8型的矩阵,因此就可以正常显示.

matlab代码

clear
i=imread('D:\Documents\Desktop\egg.jpg');%读入彩色图像
ig=rgb2gray(i);%将图像转为灰度图像
hy=fspecial('sobel');%sobel 是梯度算子,用sobel算子构建计算模板
hx=hy';%获得垂直方向和水平方向两个方向的检测模板
Iy=imfilter(double(ig),hy,'replicate');%计算垂直方向上的梯度
Ix=imfilter(double(ig),hx,'replicate');%计算水平方向上的梯度
subplot(221),imshow(i),title('original image');
subplot(222),imshow(ig),title('gray image');
subplot(223),imshow(Ix),title('filter with hx');
subplot(224),imshow(Iy),title('filter with hy');

显示结果

gradmag = sqrt (Ix.^2+Iy.^2);%求得梯度向量的模值
L=watershed(gradmag);%直接对梯度幅值图使用matlab自带的分水岭算法
figure(2);
subplot(121),imshow(gradmag),title('gradient magnitude');
subplot(122),imshow(L),title('use watershed');

显示结果


se=strel('disk',12);%构建开运算的结构元素,圆-r=12
Ie=imerode(ig,se);%进行腐蚀
Iobr = imreconstruct(Ie,ig);%对腐蚀后的图像进行重建.即将腐蚀后的结果作为标记
Iobrc = imcomplement(Iobr);%对腐蚀后的图像进行求补

Iobrd = imdilate(Iobr,se);%进行膨胀
Iobrdc = imcomplement(Iobrd);%对膨胀后的图进行求补,函数imcomplent功能: 对图像数据进行取反运算(实现底片效果)

Iobrcbr = imreconstruct (Iobrdc,Iobrc);%对腐蚀&膨胀的求补的结果进行重建
Iobrcbrc = imcomplement (Iobrcbr);%对重建结果进行求补

figure(3);
subplot(331),imshow(Ie),title('直接进行腐蚀');
subplot(332),imshow(Iobr),title('腐蚀重建');
subplot(333),imshow(Iobrc),title('腐蚀重建后求补');
subplot(334),imshow(Iobrd),title('腐蚀重建后膨胀,即进行开运算');
subplot(335),imshow(Iobrdc),title('膨胀后进行求补');
subplot(336),imshow(Iobrcbr),title('对腐蚀和膨胀的求补结果进行重建');
subplot(337),imshow(Iobrcbrc),title('对腐蚀和膨胀的求补结果进行重建后求补');


fgm = imregionalmax(Iobrcbrc);
ir=i(:,:,1);%提取原彩色RGB图像中的红色分量
ig=i(:,:,2);%提取原彩色RGB图像中的绿色分量
ib=i(:,:,3);%提取原彩色RGB图像中的蓝色分量

ir(fgm)=255;
ib(fgm)=0;
ib(fgm)=0;

i2=cat(3,ir,ig,ib);%联结成3维数组

figure(4);
subplot(231),imshow(fgm,[]),title('检测局部最大值');%原图最亮的地方
subplot(232),imshow(ir),title('红色分量');
subplot(233),imshow(ig),title('绿色分量');
subplot(234),imshow(ib),title('蓝色分量');
subplot(235),imshow(i2),title('局部极大值叠加图像');
subplot(236),imshow(fgm),title('检测局部最大值,没[]');%结果表示和有[]的没啥区别

se2=strel(ones(15,15));%构建结构元素,15×15的1矩阵
fgm2=imclose(fgm,se2);%进行闭运算,即先膨胀再腐蚀
fgm3=imerode(fgm2,se2);%载进行腐蚀
fgm4=bwareaopen(fgm3,400);%删除小于400像素的连通块

figure(5);
subplot(221),imshow(fgm),title('检测局部最大值');
subplot(222),imshow(fgm2),title('对局部最大值进行闭运算');
subplot(223),imshow(fgm3),title('闭运算后进行腐蚀');
subplot(224),imshow(fgm4),title('删除小于400像素的连通块');

bw=im2bw(Iobrcbrc,graythresh(Iobrcbrc));%对Iobrcbrc进行二值化,二值化的阈值自动获取
D=bwdist(bw);
DL=watershed(D);
bgm=DL==0;
gradmag2=imimposemin(gradmag,bgm|fgm4);%bgm和fgm4进行或运算,使得梯度幅值图像gradmag上只在或运算结果为非零的位置上有局部最小值

L=watershed(gradmag2);
%第一种显示方法
Lrgb=label2rgb(L,'jet','w','shuffle');
figure(6);
subplot(121),imshow(Lrgb),title('分水岭显示结果1');
%第二种显示方法
subplot(122),imshow(i,[]),title('分水岭显示结果2');
hold on
himage=imshow(Lrgb);
set(himage,'AlphaData',0.3);

完整的程序

clear
i=imread('D:\Documents\Desktop\egg.jpg');%读入彩色图像
ig=rgb2gray(i);%将图像转为灰度图像
hy=fspecial('sobel');%sobel 是梯度算子,用sobel算子构建计算模板
hx=hy';%获得垂直方向和水平方向两个方向的检测模板
Iy=imfilter(double(ig),hy,'replicate');%计算垂直方向上的梯度
Ix=imfilter(double(ig),hx,'replicate');%计算水平方向上的梯度
subplot(221),imshow(i),title('original image');
subplot(222),imshow(ig),title('gray image');
subplot(223),imshow(Ix),title('filter with hx');
subplot(224),imshow(Iy),title('filter with hy');

%*********************************************************
gradmag = sqrt (Ix.^2+Iy.^2);%求得梯度向量的模值
L=watershed(gradmag);%直接对梯度幅值图使用matlab自带的分水岭算法
figure(2);
subplot(121),imshow(gradmag),title('gradient magnitude');
subplot(122),imshow(L),title('use watershed');

%*********************************************************
se=strel('disk',12);%构建开运算的结构元素,圆-r=12
Ie=imerode(ig,se);%进行腐蚀
Iobr = imreconstruct(Ie,ig);%对腐蚀后的图像进行重建.即将腐蚀后的结果作为标记
Iobrc = imcomplement(Iobr);%对腐蚀后的图像进行求补

Iobrd = imdilate(Iobr,se);%进行膨胀
Iobrdc = imcomplement(Iobrd);%对膨胀后的图进行求补,函数imcomplent功能: 对图像数据进行取反运算(实现底片效果)

Iobrcbr = imreconstruct (Iobrdc,Iobrc);%对腐蚀&膨胀的求补的结果进行重建
Iobrcbrc = imcomplement (Iobrcbr);%对重建结果进行求补

figure(3);
subplot(331),imshow(Ie),title('直接进行腐蚀');
subplot(332),imshow(Iobr),title('腐蚀重建');
subplot(333),imshow(Iobrc),title('腐蚀重建后求补');
subplot(334),imshow(Iobrd),title('腐蚀重建后膨胀,即进行开运算');
subplot(335),imshow(Iobrdc),title('膨胀后进行求补');
subplot(336),imshow(Iobrcbr),title('对腐蚀和膨胀的求补结果进行重建');
subplot(337),imshow(Iobrcbrc),title('对腐蚀和膨胀的求补结果进行重建后求补');

fgm = imregionalmax(Iobrcbrc);
ir=i(:,:,1);%提取原彩色RGB图像中的红色分量
ig=i(:,:,2);%提取原彩色RGB图像中的绿色分量
ib=i(:,:,3);%提取原彩色RGB图像中的蓝色分量

ir(fgm)=255;
ib(fgm)=0;
ib(fgm)=0;

i2=cat(3,ir,ig,ib);%联结成3维数组

figure(4);
subplot(231),imshow(fgm,[]),title('检测局部最大值');%原图最亮的地方
subplot(232),imshow(ir),title('红色分量');
subplot(233),imshow(ig),title('绿色分量');
subplot(234),imshow(ib),title('蓝色分量');
subplot(235),imshow(i2),title('局部极大值叠加图像');
subplot(236),imshow(fgm),title('检测局部最大值,没[]');%结果表示和有[]的没啥区别

se2=strel(ones(15,15));%构建结构元素,15×15的1矩阵
fgm2=imclose(fgm,se2);%进行闭运算,即先膨胀再腐蚀
fgm3=imerode(fgm2,se2);%载进行腐蚀
fgm4=bwareaopen(fgm3,400);%删除小于400像素的连通块

figure(5);
subplot(221),imshow(fgm),title('检测局部最大值');
subplot(222),imshow(fgm2),title('对局部最大值进行闭运算');
subplot(223),imshow(fgm3),title('闭运算后进行腐蚀');
subplot(224),imshow(fgm4),title('删除小于400像素的连通块');

bw=im2bw(Iobrcbrc,graythresh(Iobrcbrc));%对Iobrcbrc进行二值化,二值化的阈值自动获取
D=bwdist(bw);
DL=watershed(D);
bgm=DL==0;
gradmag2=imimposemin(gradmag,bgm|fgm4);%bgm和fgm4进行或运算,使得梯度幅值图像gradmag上只在或运算结果为非零的位置上有局部最小值

L=watershed(gradmag2);
%第一种显示方法
Lrgb=label2rgb(L,'jet','w','shuffle');
figure(6);
subplot(121),imshow(Lrgb),title('分水岭显示结果1');
%第二种显示方法
subplot(122),imshow(i,[]),title('分水岭显示结果2');
hold on
himage=imshow(Lrgb);
set(himage,'AlphaData',0.3);


2018-05-12 19:30:39 qq_15262755 阅读数 1452

主要参考学习《数字图像处理 原理与实践 matlab版》

边缘检测的算法通常对领域内像素灰度求一阶导数、二阶导数以及梯度来实现,这些计算经过化简的结果成为算子(operator)。

在使用算子进行边缘检测时,我们定义边缘为像素集合:

{x|F(x)>th}

其中x为像素编号,F(x)为算子计算结果,th为临界值。边缘检测的过程可以分解为对图像的每个像素分别计算判断的过程。

边缘检测结果图中的灰度值可以直接通过算子计算原图像中对应像素的灰度差分来得到。几乎所有边缘检测的共同思想都是以像素灰度差分为基础的。在实现时,只需一次对原图像中每个元素进行计算,并把结果保存为灰度图中的像素即可。在计算时,由于灰度差分的结果进行缩放,从而得到清晰的边缘图像。

1、基于梯度的方法

计算两个指定方向的离散梯度;在通过已有的卷积核(Roberts、sobel、prewitt)计算出两个定向的梯度的差值。得到一个领域的边缘,卷积的过程对每一个位置进行这样的操作,最后得到整幅图的边缘。

matlab代码

clear;
I=imread('D:\Desktop\example.jpg');
Igray=rgb2gray(I);
im1=edge(Igray,'roberts');
im2=edge(Igray,'sobel');
im3=edge(Igray,'prewitt');

subplot(221),imshow(I),title('original');
subplot(222),imshow(im1),title('roberts');
subplot(223),imshow(im2),title('sobel');
subplot(224),imshow(im3),title('prewitt');

用三种梯度算子运行结果


2、带有方向信息的边缘检测

在边缘检测中,有时不希望对所有的边缘都进行监测,而是只检测某种类型的边缘,这就需要对边缘进行筛选.

若把图像像素的灰度看做高度,则可以把图像想象成一块高低不平的丘陵,其中灰度较高的像素在较高处,灰度低的像素在较低处,那么图像的边缘可看做丘陵中较都的斜坡,而边缘的方向就是斜坡方向。

进行带方向的边缘检测时,matlab没有内置函数,需要我们自己定义检测的模板。

常用的带方向的边缘检测模板有3种,分别是Prewitt,Kirsch,Robinson。

选取Robinson中4个算子

clear;
I=imread('D:\Desktop\example.jpg');
Igray=rgb2gray(I);
N=[1 2 1
   0 0 0
   -1 -2 -1];%Robinson算子 N方向
W=[1 0 -1
    2 0 -2
    1 0 -1];%Robinson算子 W方向
NW=[2 1 0 
    1 0 -1
    0 -1 -2];%Robinson算子 NW方向
SE=[-2 -1 0
    -1 0 1
    0 1 2];%Robinson算子 SE方向
iN=imfilter(I,N,'symmetric','conv');
iW=imfilter(I,W,'symmetric','conv');
iNW=imfilter(I,NW,'symmetric','conv');
iSE=imfilter(I,SE,'symmetric','conv');
subplot(221),imshow(iN),title('N');
subplot(222),imshow(iW),title('W');
subplot(223),imshow(iNW),title('NW');
subplot(224),imshow(iSE),title('SE');

运行结果

现在CSDN上传不了图片

后期补上,图片2018571



2018-05-23 08:53:58 qq_15262755 阅读数 4280

主要参考《数字图像处理 原理与实践(matlab版)》一书

图像分割就是把图像划分成若干个特定的、具有独特性质的取悦,并提取其中感兴趣目标的技术和过程。

1、霍夫(Hough)变换

霍夫变换提供了一种将图像像素信息按照坐标映射到参数空间的方法。在网上可以搜到很多很详细的解释,小白就不讲了。

其核心思想书上的概括是:

1)确定要识别的曲线解析式集,即在一定精度上枚举带参数的解析式中所有参数的可能取值。

2)为解析式集合中的每个元素构造计数器。

3)遍历图像中的有效像素,并将没有有效像素的坐标一次代入解析式集中的每个元素,若解析式成立,则将改解析式对应的计数器加1.

4)设定阈值t,对于计数器值大于t的解析式,可认为其对应的曲线被识别。

clear
i=imread('D:\Documents\Desktop\example1.jpg');
ig=rgb2gray(i);
bw=edge(ig,'canny');%进行canny边缘检测

[H,T,R]=hough(bw,'RhoResolution',0.5,'ThetaResolution',0.5);%对进行边缘检测后的二值图进行霍夫变换
figure(1),imshow(imadjust(mat2gray(H)),'XData',T,'YData',R,'InitialMagnification','fit');%显示霍夫变换后的边缘图
xlabel('\theta'),ylabel('\rho');
axis on; axis normal;hold on;
colormap(hot);
peaks=houghpeaks(H,15);
figure(2),imshow(bw);
hold on;%hold on是当前轴及图像保持而不被刷新,准备接受此后将绘制的图形,多图共存
lines=houghlines(bw,T,R,peaks,'FillGap',25,'MinLength',15);

max_len=0;
for k=1:length(lines)
    xy=[lines(k).point1;lines(k).point2];
    plot(xy(:,1),xy(:,2),'LineWidth',3,'Color','b');
    plot(xy(1,1),xy(1,2),'x','LineWidth',3,'Color','yellow');
    plot(xy(2,1),xy(2,2),'x','LineWidth',3,'Color','red');
    
    len=norm(lines(k).point1-lines(k).point2);
    if (len > max_len)
        max_len=len;
        xy_long=xy;
    end
end



2018-12-09 14:33:28 weixin_43962271 阅读数 45

什么是数字图像处理?历史、以及它所研究的内容。

说起图像处理,你会想到什么?你是否真的了解这个领域所研究的内容。

纵向来说,数字图像处理研究的历史相当悠久;  横向来说,数字图像处理研究的话题相当广泛。

数字图像处理的历史可以追溯到近百年以前,大约在1920年的时候,图像首次通过海底电缆从英国伦敦传送到美国纽约。

图像处理的首次应用是为了改善伦敦和纽约之间海底电缆发送的图片质量,那时就应用了图像编码,被编码后的图像通过海底电缆传送至目的地,再通过特殊设备进行输出。这是一次历史性的进步,传送一幅图片的时间从原来的一个多星期减少到了3小时。

1950年,美国的麻省理工学院制造出了第一台配有图形显示器的电子计算机——旋风I号(Whirlwind I)。旋风I号的显示器使用一个类似于示波器的阴极射线管(Cathode Ray Tube,CRT)来显示一些简单的图形。

1958年美国Calcomp公司研制出了滚筒式绘图仪,GerBer公司把数控机床发展成为平板式绘图仪。在这一时期,电子计算机都主要应用于科学计算,而为这些计算机配置的图形设备也仅仅是作为一种简单的输出设备。

随着计算机技术的进步,数字图像处理技术也得到了很大的发展。1962年,当时还在麻省理工学院攻读博士学位的伊凡·苏泽兰(Ivan Sutherland)成功开发了具有划时代意义的“画板”(Sketchpad)程式。而这正是有史以来第一个交互式绘图系统,同时这也是交互式电脑绘图的开端。从此计算机和图形图像被更加紧密地联系到了一起。鉴于伊凡·苏泽兰为计算机图形学创立所做出的杰出贡献,他于1988年被授予计算机领域最高奖——图灵奖。

1964年,美国加利福尼亚的喷气推进实验室用计算机对“旅行者七号”太空船发回的大批月球照片进行处理,以校正航天器上摄影机中各种类型的图像畸变,收到了明显的效果。在后来的宇航空间技术中,数字图像处理技术都发挥了巨大的作用。

到了20世纪60年代末期,数字图像处理已经形成了比较完善的学科体系,这套理论在20世纪70年代发展得十分迅速,并开始应用于医学影像和天文学等领域。

1972年,美国物理学家阿伦·马克利奥德·柯麦科(Allan MacLeodCormack)和英国电机工程师戈弗雷·纽博尔德·豪恩斯弗尔德(Godfrey Newbold Housfield)发明了轴向断层术,并将其用于头颅诊断。世界第一台X射线计算机轴向断层摄影装置由EMI公司研制成功,这也就是人们通常所说的CT(Computer Tomograph)。CT可通过一些算法用感知到的数据去重建通过物体的“切片”图像。这些图像组成了物体内部的再现图像,也就是根据人的头部截面的投影,经计算机处理来进行图像重建。鉴于CT对于医学诊断技术的发展所起到的巨大推动作用,柯麦科和豪恩斯弗尔德于1979年获得了诺贝尔生理或医学奖。

随后在2003年,诺贝尔生理或医学奖的殊荣再次授予了两位在医疗影像设备研究方面做出杰出贡献的科学家——美国化学家保罗·劳特伯尔(Paul Lauterbur)和英国物理学家彼得·曼斯菲尔(Peter Mansfield)。两位获奖者在利用磁共振成像(Magnetic Resonance Imaging,MRI)显示不同结构方面分别取得了开创性成就。瑞典卡罗林斯卡医学院称,这两位科学家在MRI领域的开创性工作,代表了医学诊疗和研究的重大突破。而事实上,核磁共振的成功同样也离不开数字图像处理方面的发展。即使在今天,诸如MRI图像降噪等问题依然是数字图像处理领域的热门研究方向。

说到数字图像的发展历程,还有一项至关重要的成果不得不提,那就是电荷耦合元件(Charge-coupled Device,CCD)。CCD最初是由美国贝尔实验室的科学家维拉德·波义耳(Willard Sterling Boyle)和乔治·史密斯(George Elwood Smith)于1969年发明的。CCD的作用就像胶片一样,它能够把光学影像转化为数字信号。今天人们所广泛使用的数码照相机、数码摄影机和扫描仪都是以CCD为基础发展而来的。换句话说,我们现在所研究的数字图像主要也都是通过CCD设备获取的。由于波义耳和史密斯在CCD研发上所做出的巨大贡献,他们两人共同荣获了2009年度的诺贝尔物理学奖。

数字图像处理在今天是非常热门的技术之一,生活中无处不存在着它的影子,可以说它是一种每时每刻都在改变着人类生活的技术。但长久以来,很多人对数字图像处理存在着较大的曲解,人们总是不自觉地将图像处理和Photoshop联系在一起。大名鼎鼎的Photoshop无疑是当前使用最为广泛的图像处理工具。类似的软件还有Corel公司生产的CorelDRAW等软件。

尽管Photoshop是一款非常优秀的图像处理软件,但它的存在并不代表数字图像处理的全部理论与方法。它所具有的功能仅仅是数字图像处理中的一部分。总的来说,数字图像处理研究的内容主要包括如下几个方面:

1)图像获取和输出
2)图像编码和压缩
3)图像增强与复原
4)图像的频域变换
5)图像的信息安全
6)图像的区域分割
7)图像目标的识别
8)图像的几何变换
但图像处理的研究内容,又不仅限于上述内容!所以说图像处理的研究话题是相当宽泛的。那现在图像处理都应用在哪些领域呢?或许我们可能熟知的例子有(当然,你应该还能举出更多例子):

1)一些专业图像处理软件:Photoshop、CorelDRAW……
2)一些手机APP应用:美图秀秀、玩图……
3)一些医学图像处理应用:MRI、彩超图像处理……
4)一些制造业上的应用:元器件检测、瑕疵检测……
5)一些摄像头、相机上的应用:夜间照片的质量改善……
6)一些电影工业上是应用:换背景、电影特技……

什么样的人会去学(或者需要学)图像处理?

1)如果你是我上述那些应用领域的从业者,你当然需要掌握图像方面的理论和技术;

2)相关专业的研究人员、大专院校的博士生、研究生。

所谓相关专业又是指什么呢?这个答案也可能相当宽泛,例如(但不仅限于此):

Computer Science,

Software Engineering,

Electronic Engineering,

Biomedical Engineering,

Automation, Control, Applied Mathematics……

如何学好图像处理——我的一些箴言

1)对于初级入门者

一个扎实的基础和对于图像处理理论的完整的、系统的整体认识对于后续的深入研究和实践应用具有非常非常重要的意义。

我经常喜欢拿武侠小说《天龙八部》中的一段情节来向读者说明此中的道理,相信读者对这部曾经被多次搬上银幕的金庸作品已经耳熟能详了。书中讲到有个名叫鸠摩智的番僧一心想练就绝世武学,而且他也算是个相当勤奋的人了。但是,他错就错在太过于急功近利,甚至使用道家的小无相功来催动少林绝技。看上去威力无比,而且可以在短时间内“速成”,但实则后患无穷。最终鸠摩智走火入魔,前功尽废,方才大彻大悟。这个故事其实就告诉我们打牢基础是非常重要的,特别是要取得更长足的发展,就更是要对基本原理刨根问底,力求甚解,从而做到庖丁解牛,游刃有余。

一些看似高深的算法往往是许多基础算法的组合提升。例如,令很多人望而却步的SIFT特征构建过程中,就用到了图像金字塔、直方图、高斯滤波这些非常非常基础的内容。但是,它所涉及的基础技术显然有好几个,如果缺乏对图像处理理论的系统认识,你可能会感觉事倍功半。因为所有的地方好像都是沟沟坎坎。

关于课程——

在这个阶段其实对于数学的要求并不高,你甚至可以从一些感性的角度去形象化的理解图像处理中很多内容(但不包括频域处理方面的内容)。具体到学习的建议,如果有条件(例如你还在高校里读书)你最好能选一门图像处理方面的课程,系统地完整的地去学习一下。这显然是入门的最好办法。如此一来,在建立一个完整的、系统的认知上相当有帮助。如果你没办法在学校里上一门这样的课,网上的一些公开课也可以试试。但现在中文MOOC上还没有这方面的优质课程推荐。英文的课程则有很多,例如美国加州伦斯勒理工学院Rich教授的数字图像处理公开课——https://www.youtube.com/channel/UCaiJlKxXamoODQtlx486qJA?spfreload=10。

关于教材——

显然,只听课其实还不太够,如果能一并读一本书就最好了。其实不用参考很多书,只要一本,你能从头读到尾就很好了。如果你没有条件去上一门课,那读一本来完整的自学一下就更有必要了。这个阶段,去网上到处找博客、看帖子是不行的。因为你特别需要在这个阶段对这门学问建立一个系统的完整的知识体系。东一块、西一块的胡拼乱凑无疑是坑你自己,你的知识体系就像一个气泡,可能看起来很大,但是又脆弱的不堪一击。

现在很多学校采用冈萨雷斯的《数字图像处理》一书作为教材。这是一本非常非常经典的著作。但是我必须要提醒读者:

1)这是一本专门为Electronic Engineering专业学生所写的书。它需要有信号与系统、数字信号处理这两门课作为基础。如果你没有这两门课的基础,你读这本书要么是看热闹,要么就是看不懂。

下面是冈书中的一张插图。对于EE的学生来说,这当然不是问题。但是如果没有我说的那两门课的基础,其实你很难把握其中的精髓。

H和h,一个大小一个小写,冈书中有的地方用H,有的地方用h,这都是有很深刻用意的。原作者并没有特别说明它们二者的区别,因为他已经默认你应该知道二者是不同的。事实上,它们一个表示频域信号,一个表示时域信号,这也导致有时候运算是卷积,有时候运算是乘法(当然这跟卷积定理有关)。所以我并不太建议那些没有这方面基础的学生在自学的时候读这本书。

2)冈萨雷斯教授的《数字图像处理》第一版是在1977年出版的,到现在已经快40年了;

现在国内广泛使用的第二版是2002年出版的(第三版是2007年但是其实二者差异并不大),到现在也有20年左右的时间了。

事实上,冈萨雷斯教授退休也有快30年了。所以这本书的内容已经偏于陈旧。

数字图像处理这个领域的发展绝对是日新月异,突飞猛进的。

特别在最近二三十年里,很多新思路,新方法不断涌现。

如果你看了我前面推荐的Rich教授的公开课(这也是当前美国大学正在教学的内容),你一下子就会发现,原来我们的教育还停留在改革开放之前外国的水平上。这其实特别可怕。所以我觉得冈萨雷斯教授的《数字图像处理》作为学习过程中的一个补充还是不错的,但是如果把它作为主参考,那真的就是:国外都洋枪洋炮了,我们还在大刀长矛。

2)对于中级水平者

纸上得来终觉浅,绝知此事要躬行。对于一个具有一定基础的,想更进一步的中级水平的人来说,这个阶段最重要的就是增强动手实践的能力。

还是说《天龙八部》里面的一个角色——口述武功、叹为观止的王语嫣。王语嫣的脑袋里都是武功秘籍,但问题是她从来都没练过一招一式。结果是,然并卵。所以光说不练肯定不灵啊。特别是,如果你将来想从事这个行业,结果一点代码都不会写,那几乎是不可想象的。学习阶段,最常被用来进行算法开发的工具是Matlab和OpenCV。你可以把这两个东西都理解为一个相当完善的库。当然,在工业中C++用得更多,所以Matlab的应用还是很有限的。前面我们讲到,图像处理研究内容其实包括:

图像的获取和编解码,但使用Matlab和OpenCV就会掩盖这部分内容的细节。你当然永远不会知道,JPEG文件到底是如何被解码的。

如果你的应用永远都不会涉及这些话题,那么你一直用Matlab和OpenCV当然无所谓。例如你的研究领域是SIFT、SURF这种特征匹配,可以不必理会编解码方面的内容。但是如果你的研究话题是降噪或者压缩,可能你就绕不开这些内容。最开始学的时候,如果能把这部分内容也自己写写,可能会加深你的理解。以后做高级应用开发时,再调用那些库。所以具体用什么,要不要自己写,是要视你所处的阶段和自己的实际情况而定的。以我个人的经验,在我自学的时候,我就动手写了Magic House,我觉得这个过程为我奠定了一个非常夯实的基础,对于我后续的深入研究很有帮助。

下面这个文中,我给出了一些这方面的资源,代码多多,很值得参考学习:图像处理与机器视觉网络资源收罗

http://blog.csdn.NET/baimafujinji/article/details/32332079

3)对于高级进阶者

到了这个程度的读者,编程实现之类的基本功应该不在话下。但是要往深,往高去学习、研究和开发图像处理应用,你最需要的内容就变成了数学。这个是拦在很多处于这个阶段的人面前的一大难题。如果你的专业是应用数学,当然你不会感觉有问题。但如果是其他专业背景的人就会越发感觉痛苦。

如果你的图像处理是不涉及机器学习内容的,例如用Poisson方程来做图像融合,那你就要有PDE数值解方面的知识;如果你要研究KAZE特征,你就必须要知道AOS方面的内容。如果你研究TV降噪,你又要知道泛函分析中的BV空间内容……这些词你可能很多都没听过。总的来说,这块需要的内容包括:复变函数、泛函分析、偏微分方程、变分法、数学物理方法……

如果你要涉足机器视觉方法的内容,一些机器学习和数据挖掘方法的内容就不可或缺。而这部分内容同样需要很强大的数学基础,例如最大似然方法、梯度下降法、欧拉-拉格朗日方程、最小二乘估计、凸函数与詹森不等式……

当然,走到这一步,你也已经脱胎换骨,从小白到大神啦!路漫漫其修远兮,吾将上下而求索。

(全文完

作者:wangprince2017
来源:CSDN
原文:https://blog.csdn.net/u010608296/article/details/84256105
版权声明:本文为博主原创文章,转载请附上博文链接!

没有更多推荐了,返回首页