机器视觉技术与应用实战(平均、高斯、水平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.mzph.cn/news/636989.shtml

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

相关文章

如何使用Docker部署Go Web应用

Docker部署示例 准备代码 这里我先用一段使用net/http库编写的简单代码为例讲解如何使用Docker进行部署,后面再讲解稍微复杂一点的项目部署案例。 package mainimport ("fmt""net/http" )func main() {http.HandleFunc("/", hello…

MySQL---多表查询综合练习

创建dept表 CREATE TABLE dept ( deptno INT(2) NOT NULL COMMENT 部门编号, dname VARCHAR (15) COMMENT 部门名称, loc VARCHAR (20) COMMENT 地理位置 ); 添加dept表主键 mysql> alter table dept add primary key(deptno); Query OK, 0 rows affected (0.02 s…

React16源码: React中的updateClassComponent的源码实现

ClassComponent 的更新 1 ) 概述 在 react 中 class component,是一个非常重要的角色它承担了 react 中 更新整个应用的API setStateforceUpdate 在react当中,只有更新了state之后,整个应用才会重新进行渲染在 class component 中…

李沐深度学习-多层感知机从零开始

!!!梯度的产生是由于反向传播,在自定义从零开始编写代码时,第一次反向传播前应该对params参数的梯度进行判断 import torch import numpy as np import torch.utils.data as Data import torchvision.datasets import…

对#多种编程语言 性能的研究和思考 go/c++/rust java js ruby python

对#多种编程语言 性能的研究和思考 打算学习一下rust 借着这个契机 简单的写了计算圆周率代码的各种语言的版本 比较了一下性能 只比拼单线程简单计算能力 计算十亿次循环 不考虑多线程 go/c/rust java js ruby python 耗时秒数 1:1:1:22:3:250:450 注:能启用则启…

SpringBoot ES 重建 Mapping

SpringBoot ES 重建 Mapping 1 复制数据2 删除老索引3 重建索引4 复制回数据 1 复制数据 POST http://elastic:123456127.0.0.1:9200/_reindex{"source": {"index": "老索引名称"},"dest": {"index": "备份索引名称&q…

web蓝桥杯真题--11、蓝桥知识网

介绍 蓝桥为了帮助大家学习,开发了一个知识汇总网站,现在想设计一个简单美观的首页。本题请根据要求来完成一个首页布局。 准备 开始答题前,需要先打开本题的项目代码文件夹,目录结构如下: ├── css │ └──…

Stream toList不能滥用以及与collect(Collectors.toList())的区别

Stream toList()返回的是只读List原则上不可修改,collect(Collectors.toList())默认返回的是ArrayList,可以增删改查 1. 背景 在公司看到开发环境突然发现了UnsupportedOperationException 报错,想到了不是自己throw的应该就是操作collection不当。 发…

spawn_group | spawn_group_template | linked_respawn

字段介绍 spawn_group | spawn_group_template 用来记录与脚本事件或boss战斗有关的 creatures | gameobjects 的刷新数据linked_respawn 用来将 creatures | gameobjects 和 boss 联系起来,这样如果你杀死boss, creatures | gameobjects 在副本重置之前…

测试覆盖与矩阵

4. Coverage - 衡量测试的覆盖率 我们已经掌握了如何进行单元测试。接下来,一个很自然的问题浮现出来,我们如何知道单元测试的质量呢?这就提出了测试覆盖率的概念。覆盖率测量通常用于衡量测试的有效性。它可以显示您的代码的哪些部分已被测…

【网络安全】【密码学】【北京航空航天大学】实验五、古典密码(中)【C语言实现】

实验五、古典密码(中) 实验目的和原理简介参见博客:古典密码(上) 一、实验内容 1、弗纳姆密码(Vernam Cipher) (1)、算法原理 加密原理: 加密过程可以用…

【跳槽面试】Redis中分布式锁的实现

分布式锁常见的三种实现方式: 数据库乐观锁;基于Redis的分布式锁;基于ZooKeeper的分布式锁。 本地面试考点是,你对Redis使用熟悉吗?Redis中是如何实现分布式锁的。 在Redis中,分布式锁的实现主要依赖于R…

对比一下HelpLook和Bloomfire知识库软件:谁更胜一筹?

在当今知识经济的浪潮中,知识库工具作为企业不可或缺的利器,对于提高工作效率、加强团队协作和优化员工培训等方面起着至关重要的作用。HelpLook和Bloomfire是众多知识库工具中的两款佼佼者,它们各自拥有独特的优势和特点。 一、HelpLook&…

解决 java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader 报错

在使用POI导出Excel表格的时候&#xff0c;本地运行导出没问题&#xff0c;但是发布到服务器后提示 “java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader” 下面是pom.xml中的配置 <dependency><groupId>org.apache.poi</groupId><art…

Linux查找二进制文件命令——whereis

whereis whereis 命令是一个 Linux/Unix 系统下的命令行命令&#xff0c;用于查询指定命令或程序的二进制文件、源代码文件和帮助文件的位置。 whereis 命令的语法如下&#xff1a; whereis [options] command其中&#xff0c;command 为要查询的命令或程序名称&#xff0c;…

【算法详解】力扣162.寻找峰值

​ 目录 一、题目描述二、思路分析 一、题目描述 力扣链接&#xff1a;力扣162.寻找峰值 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个…

大创项目推荐 深度学习验证码识别 - 机器视觉 python opencv

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x…

Webpack5入门到原理15:提取 Css 成单独文件

提取 Css 成单独文件 Css 文件目前被打包到 js 文件中&#xff0c;当 js 文件加载时&#xff0c;会创建一个 style 标签来生成样式 这样对于网站来说&#xff0c;会出现闪屏现象&#xff0c;用户体验不好 我们应该是单独的 Css 文件&#xff0c;通过 link 标签加载性能才好 …

gin介绍及helloworld

1. 介绍 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有快速灵活&#xff0c;容错方便等特点 对于golang而言&#xff0c;web框架的依赖要远比Python&#xff0c;Java之类的要小。自身的net/http足够简单&…

未来 AI 可能给哪些产业带来哪些进步与帮助?

AI时代如何要让公司在创新领域领先吗&#xff1f;拥抱这5种创新技能&#xff0c;可以帮助你的公司应对不断变化。包括人工智能、云平台应用、数据分析、 网络安全和体验设计。这些技能可以帮助你提高业务效率、保护公司知识资产、明智决策、满足客户需求并提高销售额。 现在就加…