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

news2024/11/27 22:39:37

     扯一点题外话,这一个月经历了太多,接连感染了甲流、乙流,人都快烧没了,乙流最为严重,烧了一个星期的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.coloradmin.cn/o/1399416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 持久化之 RDB AOF

1、简介 Redis 是一个基于内存的 key-value 类型的 Nosql 数据库,经常用来做缓存操作,但是一旦Redis 宕机,重启之后数据会丢失,因此,需要将内存数据进行持久化,保证服务重启后数据能够恢复之前的状态。Redi…

淘金城镇新人赚钱攻略(定制开发·源码定制智创开发)

​ 在淘金城镇中,玩家可以通过完成任务、升级角色、参与活动等方式获得丰厚的奖励和经验值,这不仅可以提升角色的能力, 还可以让玩家在游戏中获得更多的乐趣。最重要的是,淘金城镇的玩法非常精致,玩家可以通过游戏中…

C++——vector的使用及其模拟实现

vector的使用及其模拟实现 文章目录 vector的使用及其模拟实现1. vector的使用1.1 构造函数construct1.2 获取当前存储的数据个数size()和最大容量capacity()1.3 访问1.3.1 operator[]运算符重载1.3.2 迭代器访问1.3.3 范围for 1.4 容量相关reserve()和resize()1.5 增&#xff…

软件测试的工作描述

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

【算法练习Day50】下一个更大元素II接雨水

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 下一个更大元素II接雨水单调…

ESP32-CAM带摄像头的开发板使用-环境安装

首先是需要在开发板上搭建环境,其实就是将安装包给下载到开发板上,然后程序能在开发板上运行并控制开发板,这一下载过程也称为烧录。 首先我这里使用ESP32-CAM纯粹是因为便宜,所以买啦 哈哈哈 我买的是30多带摄像头的&#xff0c…

SpringMVC传递数据给前台

SpringMVC有三种方式将数据提供给前台 第一种 使用Request域 第二种 使用Model(数据默认是存放在Request域中) 与第一种方式其实是一致的 第三种 使用Map集合(数据默认是存放在Request域中)

虹科分享 | 汽车技术的未来:Netropy如何测试和确保汽车以太网的性能

文章速览: 什么是汽车以太网?汽车以太网的用途是什么?汽车以太网的测试要求是什么?流量生成如何帮助测试汽车以太网? 如今汽车不再是单纯的代步工具,把人从A点带到B点,同时还配备了车载信息娱乐…

深入数仓离线数据同步:问题分析与优化措施

一、前言 在数据仓库领域,离线数仓和实时数仓是常见的两种架构类型。离线数仓一般通过定时任务在特定时间点(通常是凌晨)将业务数据同步到数据仓库中。这种方式适用于对数据实时性要求不高,更侧重于历史数据分析和报告生成的场景…

大语言模型无代码构建知识图谱概述

2023年3月15日,ChatGPT4.0的横空出世,将人们对大语言模型的关注推到了风口浪尖。由于其在智能问答、翻译以及文本生成等工作任务上的卓越表现,业界一度出现了不再需要发展知识图谱相关技术的观点,知识图谱相关概念严重受挫。无可置…

web学习笔记(十六)

目录 HTML5新增标记汇总 1.新增语义化标签 2.新增音频和视频标签 2.1音频标签 audio 2.1视频标签 video 3.新增图像标签 4.新增表单元素和表单控件 5.新增应用程序标签(使用率较低) HTML5新增标记汇总 1.新增语义化标签 新增语义化标签能够便于…

HCIA-H12-811题目解析(12)

1、如图所示, 关于OSPF的拓扑和配置,下列说法中正确的是? 2、如图所示,私有网络中有一台web服务器需要向公网用户提供HTTP服务,因此网络管理员需要在网关路由器RTA上配置NAT以实现需求,则下面配置中能满足…

【OpenCV】OpenCV:计算机视觉的强大工具库

摘要   OpenCV是一个广泛应用于计算机视觉领域的开源工具库,为开发者提供了丰富的图像处理和计算机视觉算法。本文将介绍OpenCV的功能和应用领域,并探讨它在实践中的重要性和前景。 计算机视觉的强大工具库 一、什么是OpenCV?二、OpenCV的功…

qt学习:QT对话框+颜色+文件+字体+输入

目录 概述 继承图 QColorDialog 颜色对话框 QFileDialog 文件对话框 保存文件对话框 QFontDialog 字体对话框 QInputDialog 输入对话框 概述 对于对话框的功能,在GUI图形界面开发过程,使用是非常多,那么Qt也提供了丰富的对话框类QDia…

C++数的输入和输出 2023年12月c++一级 电子学会中小学生软件编程C++等级考试一级真题答案解析

目录 C数的输入和输出 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C数的输入和输出 2023年12月 C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个整数和双精度浮点数,先将浮…

负载均衡流程

1、负载均衡流程图 2、触发负载均衡函数trigger_load_balance void trigger_load_balance(struct rq *rq) { /* Dont need to rebalance while attached to NULL domain */ if (unlikely(on_null_domain(rq)))//当前调度队列中的调度域是空的则返回 return; i…

Python + Selenium —— 网页元素定位之标签名和链接文本定位

tag name tag name 为标签名定位,使用网页元素的标签名如a, div, input, span 等。 但是有一个问题,常见的标签名比如 在同一个页面上有非常多。会不会觉得 tag name 没什么用呢? 当然普通的模拟操作是不大有用,这个重复性实在…

深入剖析MyBatis缓存机制

第1章:引言 大家好,我是小黑。今天我们要聊的是MyBatis的缓存机制。作为Java开发中经常使用的持久层框架,MyBatis以其灵活性和简便性而广受欢迎。但你知道吗,很多时候,正是因为这些特点,我们需要更深入地理…

Swift抓取某网站律师内容并做排名筛选

有个很要好的朋友,今天找我说他的朋友欠他钱,因为工程上面的事情,所以一直没拿到款。想让我找个靠谱的律师帮他打官司,因为这个也不是我的强项,也没有这方面的经验。随即从律师网站爬取对应律师口碑以及成功案例&#…

pytorch 44 不修改源码在yolov8中使用odconv动态卷积

这里仅修改对YOLOv8的使用方式,不修改任何源码即可将odconv使用到最新的yolov8n模型上,实现了对私有数据集下的巨大性能提升(尤其是对于类别不平衡的少样本数据)。ODCONV是Intel提出的一种极差即用的动态卷积,在小模型上涨点效果较为明显(在大模型上涨点效果略微退化),…