机器视觉技术与应用实战(平均、高斯、水平prewitt、垂直prewitt、水平Sobel、垂直Sobel、拉普拉斯算子、锐化、中值滤波)

     扯一点题外话,这一个月经历了太多,接连感染了甲流、乙流,人都快烧没了,乙流最为严重,烧了一个星期的38-39度,咳嗽咳到虚脱。还是需要保护好身体,感觉身体扛不住几次连续发烧!(甲流乙流是病毒,提前准备好奥司他韦,这个是阻断病毒复制的药,48小时内效果是最明显的,不要像我一样等到中招了,才匆忙去买,送了3天,过了最佳时间.......)

———————————————————————————————————————————

首先,我们还是先引入一个概念,图像处理操作包括:转换操作、赋值操作、变换操作、逻辑操作、过滤操作。(过滤操作就是本节主体)

转换操作:

转换操作将输入图像转换为另外一种格式,比如说RGB图像转为灰度图像,灰度图像转为二值图像。 RGB转为灰度利用公式::

Grey =0.299*R+0.587*G+0.114*B

 在最前面的几节里面,我们了解到了RGB图像是3通道图像,一个像素的颜色由R、G、B决定。如果我们想从RGB转为灰度图像,就可以利用上面的公式实现。

灰度图像转为二值图像就是利用二值化,设定一个阈值,小于阈值为0,大于阈值为1,在之前的几节里面我们也是涉及到了的。

赋值操作:

初始化:将图像中所有的像素的灰度值赋值为某一个常数,这个里面必须要明确的是图像高度和宽度。

复制:将输入图像的每个像素灰度值复制输出到输出图像像素的灰度值中。

反转:灰度值的变换,假如一个图像灰度值范围为[0-255],设图像的一个像素的灰度值为x,图像反转后的 灰度值为Y=255-X

变换操作:

变换操作通常涉及到输入图像的频率域,空间域到频率域的转换需要傅里叶变换。

过滤操作:

过滤操作描述:为使用正方形、矩形或线性过滤矩阵对输入图像进行卷积

滤波器包括:平均、高斯、水平prewitt、垂直prewitt、水平Sobel、垂直Sobel、拉普拉斯算子、锐 化、中值滤波。

在我看来,对于一个滤波器来说,最能体现出滤波器的特点的地方应该是内核的元素的值。后面的不同滤波器代码可能都只是修改了内核的值。由于内容比较多,动手去实现就非常好理解!

平均滤波:平均过滤器旨在消除噪声

matlab代码如下:

clear;
n = 5;
I = imread('1.tif');
j = imnoise(I,'salt',0.02);
[height,width] = size(j);
FilterMid = j;
for row = (n+1)/2: height-(n-1)/2
for col = (n+1)/2:width-(n-1)/2
temp = double(j(row-((n-1)/2):row+((n-1)/2),col-((n-1)/2):col+((n-1)/2)));
template2 = sort(temp(:));
FilterMid(row,col) = template2((n*n+1)/2);
end
end
figure,subplot(1,3,1),imshow(I),title('原图像');
subplot(1,3,2),imshow(j),title('椒盐处理后的图像');
subplot(1,3,3),imshow(FilterMid),title('中值滤波后图像');

处理结果如下:

 高斯滤波:线性平滑滤波器,利用的是加权平均的处理方法,权重利用的是距离的远近距离越近权重越大,也就是说对中心像素点的像素值生成影响越大。

代码如下:

clear,clc;
Img = imread('1.tif');
M = size(Img);
if numel(M)>2%判断灰度图像还是彩色图像
gray = rgb2gray(Img);
else
gray = Img;
end
%创建滤波器
I = imnoise(gray,'salt',0.02);
W =fspecial('gaussian',[5,5],1);
G = imfilter(I,W,'replicate');
figure
subplot(1,3,1),imshow(gray),title('原图像');
subplot(1,3,2),imshow(I),title('加了噪声图像');
subplot(1,3,3),imshow(G),title('高斯滤波器处理后图像');

运行结果如下:

水平prewitt :水平Prewitt操作类似梯度滤波器一样,梯度滤波器也叫边缘滤波器,具有通过被考察像素某 一个方向的灰度变化的梯度(即出现突变的地方),找到边缘位置的作用,主打一个突出水平边缘效果。

垂直prewitt :垂直prewitt具有突出图像垂直边缘的效果。

matlab代码如下:

clear;
F = imread('1.png');
F = rgb2gray(F);
f = double(F);
[row,col] = size(f);
f1 = zeros(row,col);
f2 = zeros(row,col);
f3 = zeros(row,col);
gy = [1,0,-1;1,0,-1;1,0,-1];
gx = [-1,-1,-1;0,0,0;1,1,1];
for i=2:row-1
for j=2:col-1
fx = [f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j1),f(i+1,j),f(i+1,j+1)];
fy = [f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j1),f(i+1,j),f(i+1,j+1)];
Gx = gx.*fx;
Gy = gy.*fy;
A = abs(sum(Gx(:)));
B = abs(sum(Gy(:)));
C = ((sum(Gx(:)))^2+(sum(Gy(:)))^2)^0.5;
if A >= 50//50为阈值,后面B、C同理
f1(i,j) = 255;
end
if B >= 50
f2(i,j) = 255;
end
if C >=50
f3(i,j) = 255;
end
end
end
figure
subplot(2,2,1),imshow(F),title('原图像');
subplot(2,2,2),imshow(f1),title('水平prewitt');
subplot(2,2,3),imshow(f2),title('垂直prewitt');
subplot(2,2,4),imshow(f3),title('水平且垂直prewitt');

运行结果如下:

阈值的设置需要不断去调整,没有说固定的最佳的阈值。

Sobel: 

水平Sobel:同理于prewitt算子,可以突出水平边缘,但是却通过与中心像素点的距离修改了影响的参数。

垂直sobel同样如此。

matlab代码如下:

clear;
F = imread('1.bmp');
F = rgb2gray(F);
f = double(F);
[row,col] = size(f);
f1 = zeros(row,col);
f2 = zeros(row,col);
f3 = zeros(row,col);
gx = [-1,-2,-1;0,0,0;1,2,1];
gy = [1,0,-1;2,0,-2;1,0,-1];
for i=2:row-1
for j=2:col-1
fx = [f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j1),f(i+1,j),f(i+1,j+1)];
fy = [f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j1),f(i+1,j),f(i+1,j+1)];
Gx = gx.*fx;
Gy = gy.*fy;
A = abs(sum(Gx(:)));
B = abs(sum(Gy(:)));
C = ((sum(Gx(:)))^2+(sum(Gy(:)))^2)^0.5;
if A >= 50
f1(i,j) = 255;
end
if B >= 50
f2(i,j) = 255;
end
if C >=50
f3(i,j) = 255;
end
end
end
figure
subplot(2,2,1),imshow(F),title('原图像');
subplot(2,2,2),imshow(f1),title('水平sobel');
subplot(2,2,3),imshow(f2),title('垂直sobel');
subplot(2,2,4),imshow(f3),title('水平且垂直sobel');

运行结果如下:

拉普拉斯算子:

二阶导数算子,作用是突出边缘效果,也就是锐化的效果

matlab代码如下:

clear;
img= imread('1.bmp');
%I = rgb2gray(img);
I= im2double(img);
[m,n]=size(I);
result =zeros(size(I));
laplace = [-1,-1,-1;-1,8,-1;-1,-1,-1];
for i= 2:m-1
for j= 2:n-1
f = [I(i-1,j-1),I(i-1,j),I(i-1,j+1);I(i,j-1),I(i,j),I(i,j+1);I(i+1,j1),I(i+1,j),I(i+1,j+1)];
G= laplace.*f;
result(i,j)= abs(sum(G(:)));
end
end
img = im2uint8(img);
result = im2uint8(result);
figure
subplot(1,2,1),imshow(img),title('原图像');
subplot(1,2,2),imshow(result),title('拉普拉斯处理后图像');

运行结果如下:

锐化低和锐化图像: 

锐化:突出边缘

锐化低:突出边缘的同时平滑图像

代码如下:

clear;
img= imread('1.bmp');
%I = rgb2gray(img);
I= im2double(img);
[m,n]=size(I);
result =zeros(size(I));
result1 = zeros(size(I));
result2 = zeros(size(I));
laplace = [-1,-1,-1;-1,8,-1;-1,-1,-1];
sharpen = [-1,-1,-1;-1,9,-1;-1,-1,-1];
sharpen_low = [-1/8,-1/8,-1/8;-1/8,2,-1/8;-1/8,-1/8,-1/8];
for i= 2:m-1
for j= 2:n-1
f = [I(i-1,j-1),I(i-1,j),I(i-1,j+1);I(i,j-1),I(i,j),I(i,j+1);I(i+1,j1),I(i+1,j),I(i+1,j+1)];
G= laplace.*f;
G2 = sharpen.*f;
G3 =sharpen_low.*f;
result(i,j)= abs(sum(G(:)));
result1(i,j)= abs(sum(G2(:)));
result2(i,j)= abs(sum(G3(:)));
end
end
img = im2uint8(img);
result = im2uint8(result);
result1 = im2uint8(result1);
result2 = im2uint8(result2);
figure
subplot(2,2,1),imshow(img),title('原图像');
subplot(2,2,2),imshow(result),title('拉普拉斯处理后图像');
subplot(2,2,3),imshow(result1),title('锐化处理图像');
subplot(2,2,4),imshow(result2),title('锐化低处理图像');

结果如下:

中值滤波:取内核的中值作为中心元素的值。

代码如下:

clear;
n = 5;
img = imread('1.bmp');
j = imnoise(img,'salt',0.02);
[height,width] = size(j);
FilterMid = j;
for row = (n+1)/2:height-(n-1)/2
for col = (n+1)/2:width-(n-1)/2
temp = double(j(row-((n-1)/2):row+((n-1)/2),col-((n-1)/2):col+((n-1)/2)));
template2 = sort(temp(:));
FilterMid(row,col)= template2((n*n+1)/2);
end
end
figure
subplot(1,3,1),imshow(img),title('原图像');
subplot(1,3,2),imshow(j),title('加入椒盐噪声的图像');
subplot(1,3,3),imshow(FilterMid),title('中值滤波处理后的图像');

运行结果如下:

 均值滤波:取内核的均值作为中心元素的值

代码如下:

clear;
clc;
fn=imread('1.bmp');
f=imnoise(fn,'salt',0.02);
[row,col]=size(f);
f1 = zeros(row,col);
for i=2:row-1
for j=2:col-1
f2 =[f(i-1,j-1),f(i-1,j),f(i-1,j+1);f(i,j-1),f(i,j),f(i,j+1);f(i+1,j1),f(i+1,j),f(i+1,j+1)];
f1(i,j) = mean((f2(:)));
end
end
f1= round(f1);
%f1 = double2uint8(f1);
imshow(f1);
figure
subplot(1,3,1),imshow(fn),title('原图像');
subplot(1,3,2),imshow(f),title('加入噪声的图像');
subplot(1,3,3),imshow(f1,[0,255]),title('均值滤波处理后的图像');

运行结果如下:

建议去动手实现一下! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/419039.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gin中间件篇

1. 全局中间件 所有请求都经过此中间件 package mainimport ("fmt""time""github.com/gin-gonic/gin" )// 定义中间 func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t : time.Now()fmt.Println("中间件开始执行了&quo…

设计模式-资源库模式

设计模式专栏 模式介绍模式特点应用场景资源库模式与关系型数据库的区别代码示例Java实现资源库模式Python实现资源库模式 资源库模式在spring中的应用 模式介绍 资源库模式是一种架构模式,介于领域层与数据映射层(数据访问层)之间。它的存在…

Linux中关于head命令详解

head的作用 head用于查看文件的开头部分的内容。 head的参数 -q隐藏文件名-v 显示文件名-c<数目>显示的字节数-n<数目>显示的行数 head的案例 # 查看yum.log前五行内容 head -5 yum.log

Datawhale 强化学习笔记(三)基于策略梯度(policy-based)的算法

文章目录 参考基于价值函数的缺点策略梯度算法REINFORCE 算法策略梯度推导进阶策略函数的设计离散动作的策略函数连续动作的策略函数 参考 第九章 策略梯度 之前介绍的 DQN 算法属于基于价值(value-based)的算法&#xff0c;基于策略梯度的算法直接对策略本身进行优化。 将策…

最优传输学习及问题总结

文章目录 参考内容lam0.1lam3lam10lam50lam100lam300画图线性规划matlabpython代码 参考内容 https://blog.csdn.net/qq_41129489/article/details/128830589 https://zhuanlan.zhihu.com/p/542379144 我主要想强调的是这个例子的解法存在的一些细节问题 lam0.1 lam 0.1P,…

EasyDarwin计划新增将各种流协议(RTSP、RTMP、HTTP、TCP、UDP)、文件转推RTMP到其他视频直播平台,支持转码H.264、文件直播推送

之前我们尝试做过EasyRTSPLive&#xff08;将RTSP流转推RTMP&#xff09;和EasyRTMPLive&#xff08;将各种RTSP/RTMP/HTTP/UDP流转推RTMP&#xff0c;这两个服务在市场上都得到了比较多的好评&#xff0c;其中&#xff1a; 1、EasyRTSPLive用的是EasyRTSPClient取流&#xff…

MySQL缓冲池(Buffer Pool)深入解析:原理、组成及其在数据操作中的核心作用

在关系型数据库管理系统&#xff08;RDBMS&#xff09;中&#xff0c;性能优化一直是数据库管理员和开发者关注的焦点。作为最流行的开源RDBMS之一&#xff0c;MySQL提供了多种优化手段&#xff0c;其中InnoDB存储引擎的缓冲池&#xff08;Buffer Pool&#xff09;是最为关键的…

ctfshow-反序列化(web271-web276)

目录 web271 web272-273 web274 web275 web276 为什么不用分析具体为什么能成功 ,后面会有几个专题 会对php框架进行更深入的了解 这里面会专门的研究 为什么能够实现RCE 前面作为初步的熟悉 首先知道一下他的框架 知道框架的风格 知道啥版本可以用什么来打 首先先不用太研…

Spring+SprinMVC+MyBatis注解方式简易模板

SpringSprinMVCMyBatis注解方式简易模板代码Demo GitHub访问 ssm-tpl-anno 一、数据准备 创建数据库test&#xff0c;执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Version :…

2008年苏州大学837复试机试C语言

2008年苏州大学复试机试C 题目 编写程序充成以下功能: 一、从键盘上输入随机变量x的 10个取样点。X0&#xff0c;X1—X9 的值; 1、计算样本平均值 2、判定x是否为等差数列 3、用以下公式计算z的值(t0.63) 注。请对程序中必要地方进行注释 补充&#xff1a;个人觉得这个题目回…

canvas绘制正三边形,正四边形,正五边形...正N边形

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

使 a === 1 a === 2 a === 3 为 true 的几种“下毒“方法

前言 这算得上是近些年的前端网红题了&#xff0c;曾经对这种网红题非常抵触&#xff0c;认为非常没有意义。 看到了不少人有做分享&#xff0c;有各种各样的方案&#xff0c;有涉及到 JS 非常基础的知识点&#xff0c;也不得不感叹解题者的脑洞之大。 但是&#xff0c;拿来…