matlab 图像处理 图片,matlab实现图像处理的一些简单算法

在最开始提供一个查询函数的链接

滤波处理的原因:

数字图像在其形成、传输记录的过程中往往会受到很多噪声的的污染,比如:椒盐噪声、高斯噪声等,为了抑制和消除这些随即产生的噪声而改善图像的质量,就需要去、对图像进行去噪处理,去噪也就是滤波处理。

原理略直接上效果

dc3d8a2f7ecadaa0a7c482c4fd8b0b24.png

%gray = 0.299 * R + 0.587* G + 0.114 * B

rgb = imread('xiongmao.jpg');

r = rgb(:,:,1);

g = rgb(:,:,2);

b = rgb(:,:,3);

[ROW,COL] = size(r);% 得到该图片的行列数

for row = 1:ROW

for col = 1:COL

gray(row,col) =  0.299 * r(row,col) + 0.587 * g(row,col) +0.114 * b(row,col) ;

subplot(1,2,1);

imshow(rgb);

title('原图');

subplot(1,2,2);

imshow(gray)

title('转灰度后');

均值滤波

均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值

实现结果:

3ca8fe721e6a9164c8ebbe775d7aa04b.png

可以很明显看到均值滤波对椒盐噪声没有一个很好的降噪能力。其更适合高斯或者均匀随机噪声。

rgb = imread('jiqiren.jpg');

r = rgb(:,:,1);

g = rgb(:,:,2);

b = rgb(:,:,3);

[ROW,COL] = size(r);% 得到该图片的行列数

for row = 1:ROW

for col = 1:COL

gray(row,col) =  0.299 * r(row,col) + 0.587 * g(row,col) +0.114 * b(row,col) ;

%以上得到灰度图像 gray_double(:,:,1)=gray;

gray_double(:,:,2)=gray;

gray_double(:,:,3)=gray;

gray_double = im2double(gray_double);

%生成滤波模板

mean_mobel = [  1 1 1

for r = 2:ROW-1

for c = 2:COL-1

mean3x3 =  [gray_double(r -1,c - 1),gray_double(r -1,c),gray_double(r - 1,c + 1);

gray_double(r   ,c - 1),gray_double(r    ,c),gray_double(r    ,c + 1);

gray_double(r +1,c -1),gray_double(r + 1,c),gray_double(r + 1,c + 1)];

meanx3 = mean3x3 .* mean_mobel;

mean(r,c)  = sum( sum(meanx3) ) / 9;

subplot(2,2,1)

imshow(rgb);

title('原图');

subplot(2,2,2) ;

imshow(gray);

title('灰度');

subplot(2,2,3);

imshow(mean);

title('mean');

中值滤波

1,中值滤波的特点:

中值滤波是图像平滑的一种方法 它是一种非线性平滑滤波技术,在一定条件下可以克服线性滤波带来的图像细节的模糊问题,特别是针对被椒盐噪声污染的图像。

2,中值滤波的介绍:

所谓中值滤波,其中滤波就是前面讲的去噪,关键在于中值两字,中值从字面意思上讲就是中间的那个值也就是中心值。

中值滤波通常采用一个含奇数个点的滑动窗口,用窗口的中的灰度值的中值来代替中心点的灰度值,其实就是对这个窗口中的灰度值进行排序,然后将其中值赋值给中心点即可。常用的中值滤波窗口形状有线状、方形、圆形以及十字形等。

3,实现:

在此采用的3x3的矩阵模板,将9个像素中的中间值那个找到替换对应当前像素点

处理效果:

1981e30c49669ab208e5ffe47b473736.png

%B = sort(A)按升序对 A的元素进行排序。

%如果 A是向量,则sort(A)对向量元素进行排序。

%如果 A是矩阵,则sort(A)会将A的列视为向量并对每列进行排序。

%如果 A是多维数组,则sort(A)会沿大小不等于 1 的第一个数组维度计算,并将这些元素视为向量。

%B = sort(A,dim)返回 A沿维度 dim的排序元素。例如,如果 A是一个矩阵,则 sort(A,2)对每行中的元素进行排序。

%B = sort(___,direction)使用上述任何语法返回按 direction指定的顺序显示的 A的有序元素。'ascend'表示升序(默认值),'descend'表示降序。

%B = sort(___,Name,Value)指定用于排序的其他参数。例如,sort(A,'ComparisonMethod','abs')按模对 A的元素进行排序。

% [B,I] = sort(___)还会为上述任意语法返回一个索引向量的集合。I的大小与 A的大小相同,它描述了 A的元素沿已排序的维度在 B中的排列情况。例如,如果 A是一个向量,则 B =A(I)。

rgb = imread('jiqiren.jpg');

r = rgb(:,:,1);

g = rgb(:,:,2);

b = rgb(:,:,3);

[ROW,COL] = size(r);%得到该图片的行列数

for row = 1:ROW

for col = 1:COL

gray(row,col) =  0.299 * r(row,col) + 0.587 * g(row,col) +0.114 * b(row,col) ;

%以上得到灰度图像

gray_double(:,:,1)=gray;

gray_double(:,:,2)=gray;

gray_double(:,:,3)=gray;

gray_double = im2double(gray_double);

gray_double = imnoise(gray_double,'salt & pepper',0.1)

for r = 2:ROW-1

for c = 2:COL-1

median3x3 =  [gray_double(r -1,c - 1),gray_double(r -1,c),gray_double(r - 1,c + 1);

gray_double(r   ,c - 1),gray_double(r    ,c),gray_double(r    ,c + 1);

gray_double(r +1,c -1),gray_double(r + 1,c),gray_double(r + 1,c + 1)];

median3x3        = sort(median3x3,2);  %sort(A) 向量元素默认升序排列

median3x3        =sort(median3x3,1);

median3x3(2,1:3) =sort(median3x3(2,1:3));

median(r,c) = median3x3(2,2);

subplot(2,2,1)

imshow(rgb);

title('原图');

subplot(2,2,2) ;

imshow(gray);

title('灰度');

subplot(2,2,3) ;

imshow(gray_double);

title('加噪');

subplot(2,2,4);

imshow(median);

title('median');

sobel边缘检测

图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大。

Sobel算子主要用作边缘检测,它是一离散型差分算子,用来计算图像亮度函数灰度之近似值。

边缘是指其周围像素灰度急剧变化的那些像素的集合。边缘存在于目标、背景和区域之间,所以,边缘是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,因此,边缘也是图像匹配的重要的特征。

Sobel边缘检测的核心在于像素矩阵的卷积,卷积对于数字图像处理非常重要,很多图像处理算法都是做卷积来实现的。卷积运算的本质就是对指定的图像区域的像素值进行加权求和的过程,其计算过程为图像区域中的每个像素值分别与卷积模板的每个元素对应相乘,将卷积的结果作求和运算,运算到的和就是卷积运算的结果。

具体原理可以百度

4263a936128ee7fc24c0bb8f7afe797f.png

rgb = imread('xiongmao.jpg');

r = rgb(:,:,1);

g = rgb(:,:,2);

b = rgb(:,:,3);

[ROW,COL] = size(r);% 得到该图片的行列数

for row = 1:ROW

for col = 1:COL

gary(row,col) =  0.299 * r(row,col) + 0.587 * g(row,col) +0.114 * b(row,col) ;

%以上得到灰度图像

gary_double = double(gary);

[R,C] = size(gary_double);%得到该图片的行列数

%生成滤波模板Gx

gx = [-1 0 1

%生成滤波模板Gy

gy = [1  2  1

0 0  0

threshold = 150;

for r = 2:R-1

for c = 2:C-1

sobel3x3 = [gary_double(r -1,c -1),gary_double(r - 1,c),gary_double(r - 1,c + 1);

gary_double(r   ,c - 1),gary_double(r    ,c),gary_double(r    ,c + 1);

gary_double(r +1,c -1),gary_double(r + 1,c),gary_double(r + 1,c + 1)];

sobel_gx3 = sobel3x3 .* gx;

sobel_gy3 = sobel3x3 .* gy;

sobel_gx  = abs(sum(sum(sobel_gx3)));

sobel_gy  = abs(sum(sum(sobel_gy3)));

sobel(r,c)= sqrt((sobel_gx * sobel_gx)+ (sobel_gy * sobel_gy));

if sobel(r,c) >threshold

sobel_threshold(r,c) = 255;

sobel_threshold(r,c) = 0;

subplot(2,2,1)

imshow(rgb);

title('原图');

subplot(2,2,2) ;

imshow(gary);

title('灰度');

subplot(2,2,3);

imshow(sobel);

title('sobel');

subplot(2,2,4)

imshow(sobel_threshold);

title('sobel后二值化');

直方图均衡化

直方图均衡化(HistogramEqualization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果。

直方图是表示数字图像中每一灰度出现频率的统计关系。直方图能给出图像灰度范围、每个灰度的频度和灰度的分布、整幅图像的平均明暗和对比度等概貌性描述。灰度直方图是灰度级的函数, 反映的是图像中具有该灰度级像素的个数, 其横坐标是灰度级r, 纵坐标是该灰度级出现的频率( 即像素的个数) pr( r) , 整个坐标系描述的是图像灰度级的分布情况, 由此可以看出图像的灰度分布特性, 即若大部分像素集中在低灰度区域, 图像呈现暗的特性; 若像素集中在高灰度区域, 图像呈现亮的特性。

主要解决过曝光或者曝光不足。

显示效果

ad0085d06ab8514e59867add8e88ac70.png

这是各个灰度值均衡化之前的分布和均衡化之后的分布

72966ee1c5a1f9ca3501c91f6ea27d9c.png

rgb = imread('timg.jpg');

r = rgb(:,:,1);

g = rgb(:,:,2);

b = rgb(:,:,3);

[ROW,COL] = size(r);%得到该图行列数

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值