百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

计算机视觉系列_3、OpenCV简单操作

bigegpt 2024-09-17 12:40 4 浏览

文章目录

??前言

??阈值分割基础理论知识

??阈值处理代码及实现讲解

??图像平滑概念及具体知识

均值滤波

方框滤波

高斯滤波

中值滤波

卷积

??前言

OpenCV提供的视觉处理算法非常丰富,并且它部分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译链接生成执行程序,所以很多人用它来做算法的移植,OpenCV的代码经过适当改写可以正常的运行在DSP系统和ARM嵌入式系统中,这种移植在大学中经常作为相关专业本科生毕业设计或者研究生课题的选题。

OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库得到更快的处理速度。

可应用领域包括: 1、人机互动 2、物体识别 3、图像分割 4、人脸识别 5、动作识别 6、运动跟踪 7、机器人 8、运动分析 9、机器视觉 10、结构分析 11、汽车安全驾驶等方面

??阈值分割基础理论知识

阈值分割得六种形态图:

1.第一种为原始图像像素值分布图。
2.二进制阈值化:假设我们设定阈值为189,如果大于189得像素值那么我们就把该像素值设置为最大值,也就是255。如果低于189得像素值,那么我们就设置该像素值为0。


3.反二进制阈值化:根据意思我们就可以知道和二进制阈值化相反,那么就说明如果我们设定阈值为189,那么大于189得像素值就是0,如果低于189得像素值,那么就设定像素值为255.


4.截断阈值化:假设我们设定阈值时127,那么如果像素值大于127,那么我们直接设定像素值为127,如果低于127,那么就保持像素值不变。


5.反阈值化为0:假如我们设定阈值为127,那么如果像素大于127,那么我们将新的像素值设定为0,如果低于127,那么我们将保留原始得像素值。


6.阈值化为0:假设我们依旧设定阈值为127,那么如果像素值高于127,那么我们保持不变,如果低于127,那么我们设定新的像素值为0.

??阈值处理代码及实现讲解

阈值处理函数:
函数threshold

retval, dst=cv2.threshold(src, thresh, maxval, type)
1

其中src表示原图像,thresh表示阈值,maxval表示最大值,type表示类型。函数对应返回两个值,分别是阈值和处理结果。

二进制阈值化代码
核心代码:
cv2.THRESH_BINARY

import cv2
a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
1234567

以lena为例子,处理结果是:


可以看出来,将原来的灰度图像处理成了只有0和最大值255的图像,可以说处理成了二值图像。
反二进制阈值化代码:
核心代码:
cv2.THRESH_BINARY_INV

import cv2
a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
1234567

这里只需要改动一个位置就可以,那么处理结果为:


就是和原来的二进制阈值化相反处理。
截断阈值化:
核心代码:
cv2.THRESH_TRUNC

import cv2
a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TRUNC)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
1234567

处理结果:


也就是说将图像的明亮部分都处理在阈值以下。
反阈值化为0代码:
核心代码:
cv2.THRESH_TOZERO_INV

port cv2
a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO_INV)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
1234567

处理结果是:


将所有亮的地方都处理为黑色。也就是说高于阈值的地方都处理呈黑色。

阈值化为0代码:
核心代码:
cv2.THRESH_TOZERO

import cv2
a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
1234567


将低于阈值部分都处理成黑色,其他不变。

??图像平滑概念及具体知识

均值滤波

??均值滤波:很明显我们通过白话来讲就是说肯定跟平均值有关,那么怎么和平均值相关的呢?

首先我们来看一下一个图像的区域像素值分布:



然后我们来看中间区域的红色部分为例子进行均值滤波处理计算:
红色点的像素新值=蓝色背景区域像素值之和除25
红色点的像素新值=
((197+25+106+156+159)+(149+40+107+5+71)+
(163+198+226+223+156)+(222+37+68+193+157)+
(42+72+250+41+75))/25


针对原始图像内的像素点,逐个采用核进行处理,得到结果图像。也就是说每一个像素点都进行这个操作。那么有什么用呢?作用就是可以把尖锐的像素点的值给模糊掉然我们来看例子
函数结果:
处理结果=cv2.blur(原始图像,核大小)
核大小:
以(宽度,高度)形式表示的元组

import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.blur(o,(5,5))
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
1234567

专业一点来讲就是可以除噪:

方框滤波

??方框滤波:主要是看函数的最后一个属性,如果设置为-1,那么方框滤波与均值滤波一样的效果,如果设置成1,那么就表示核函数内进行相加。具体请看下面讲解。

主要函数:boxFilter。 ??运行结果=cv2. boxFilter(原始图像,目标图像深度,核大小,normalize属性),??其中原始图像都理解,??目标图像深度通常设置成-1,表示与原始图像相同,??核函数请看下方图一,如果设置呈元组(5,5)就表示为下方左边图。??normalize属性表示是否对图像进行归一化处理,如果进行归一化处理就设置成ture,不设置就为false。??那么如果设置归一化处理的结果就是与均值滤波完全一致,如果不设置归一化处理,那么就表示核函数之间相加。看图二


??方框滤波代码部分
normalize=1就表示进行归一化处理,和不设置一样,也就是说默认就是进行归一化处理。如果设置为0,就表示不进行归一化处理。代码分别是:

import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5),normalize=1)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
1234567
import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5),normalize=0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
1234567

对应结果分别是:



不进行归一化处理如果5×5的值相加很容易超过255,那么我们就都变成了255的像素值,也就都是白色了。
那么如果我们设置核函数为2×2呢,让核函数小一点。那么对应的结果为:


这样滤波后的结果就不都是255了,就变成了有的地方的像素值是小于255的。但是像素值都比之前要高很多。

高斯滤波

高斯滤波:其实高斯滤波很简单,原理就是谁离我目标点越近,我就跟谁越好,给他的东西越多,对应官方的话就是给予权重越大。让临近的像素值有更高的重要度。

高斯滤波核心函数:GaussianBlur函数。

dst = cv2.GaussianBlur( src , ksize , sigmaX )

其中:
src为原始图像
ksize核函数的大小,
这里需要注意,就是设置的核函数的大小必须为奇数大小
sigmaX表示高斯滤波函数X方向的方差,
这里表示成水平方向的规律就好了。用来控制权重。
sigmaX=0时: sigma = 0.3((ksize-1)0.5 - 1) + 0.8

高斯滤波对应代码:

import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.GaussianBlur(o,(3,3),0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
1234567


这里可以看出,使用高斯滤波可以完成去噪的功能,但是他是缓和的去噪,根据他的原理我们就可以知道。

中值滤波

中值滤波:这里就很好理解了,比如我们取了核函数的大小,然后把核函数中的像素值进行排序,然后取中值替换到现在的值。

主要函数:medianBlur函数

dst = cv2.medianBlur( src , ksize )

其中src表示原始图像,ksize表示核函数的大小。同样这里的核函数的大小必须是奇数。且不是原则,直接写数字就可以,比如3就表示3*3

中值滤波代码部分

import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.medianBlur(o,3)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
1234567


这里去噪最为完美因为很明显的就把很高的像素点都去掉了!!!

卷积

卷积:其实卷积也很简单的,之前我们介绍的均值滤波、中值滤波、方框滤波及高斯滤波都是基于图像本身做出操作,那么卷积就是我们设置了一个卷积核,用这个核去和我们图像的每一个像素值做乘法。

2D卷积核心函数:
卷积核函数:
kernel = np.ones((5,5),np.float32)/25
设置的是5*5的卷积核。如图:


2D卷积核心函数:r=cv2.filter2D( o , -1 ,f )
-1表示图像深度和原图像一致,最后一个f表示卷积核的意思。
代码部分:

import cv2
import numpy as np
o=cv2.imread("image\lenacolor.png")
f=np.ones((5,5),np.float32)/25
r=cv2.filter2D(o,-1,f)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
123456789

所以我们可以通过原理得到如果卷积核设置的越大,那么图像就会越模糊。

import cv2
import numpy as np
o=cv2.imread("image\lenacolor.png")
f=np.ones((10,10),np.float32)/100
r=cv2.filter2D(o,-1,f)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
123456789

相关推荐

方差分析简介(方差分析通俗理解)

介绍方差分析(ANOVA,AnalysisofVariance)是一种广泛使用的统计方法,用于比较两个或多个组之间的均值。单因素方差分析是方差分析的一种变体,旨在检测三个或更多分类组的均值是否存在...

正如404页面所预示,猴子正成为断网元凶--吧嗒吧嗒真好吃

吧嗒吧嗒,绘图:MakiNaro你可以通过加热、冰冻、水淹、模塑、甚至压溃压力来使网络光缆硬化。但用猴子显然是不行的。光缆那新挤压成型的塑料外皮太尼玛诱人了,无法阻挡一场试吃盛宴的举行。印度政府正...

Python数据可视化:箱线图多种库画法

概念箱线图通过数据的四分位数来展示数据的分布情况。例如:数据的中心位置,数据间的离散程度,是否有异常值等。把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)...

多组独立(完全随机设计)样本秩和检验的SPSS操作教程及结果解读

作者/风仕在上一期,我们已经讲完了两组独立样本秩和检验的SPSS操作教程及结果解读,这期开始讲多组独立样本秩和检验,我们主要从多组独立样本秩和检验介绍、两组独立样本秩和检验使用条件及案例的SPSS操作...

方差分析 in R语言 and Excel(方差分析r语言例题)

今天来写一篇实际中比较实用的分析方法,方差分析。通过方差分析,我们可以确定组别之间的差异是否超出了由于随机因素引起的差异范围。方差分析分为单因素方差分析和多因素方差分析,这一篇先介绍一下单因素方差分析...

可视化:前端数据可视化插件大盘点 图表/图谱/地图/关系图

前端数据可视化插件大盘点图表/图谱/地图/关系图全有在大数据时代,很多时候我们需要在网页中显示数据统计报表,从而能很直观地了解数据的走向,开发人员很多时候需要使用图表来表现一些数据。随着Web技术的...

matplotlib 必知的 15 个图(matplotlib各种图)

施工专题,我已完成20篇,施工系列几乎覆盖Python完整技术栈,目标只总结实践中最实用的东西,直击问题本质,快速帮助读者们入门和进阶:1我的施工计划2数字专题3字符串专题4列表专题5流程控制专题6编...

R ggplot2常用图表绘制指南(ggplot2绘制折线图)

ggplot2是R语言中强大的数据可视化包,基于“图形语法”(GrammarofGraphics),通过分层方式构建图表。以下是常用图表命令的详细指南,涵盖基本语法、常见图表类型及示例,适合...

Python数据可视化:从Pandas基础到Seaborn高级应用

数据可视化是数据分析中不可或缺的一环,它能帮助我们直观理解数据模式和趋势。本文将全面介绍Python中最常用的三种可视化方法。Pandas内置绘图功能Pandas基于Matplotlib提供了简洁的绘...

Python 数据可视化常用命令备忘录

本文提供了一个全面的Python数据可视化备忘单,适用于探索性数据分析(EDA)。该备忘单涵盖了单变量分析、双变量分析、多变量分析、时间序列分析、文本数据分析、可视化定制以及保存与显示等内容。所...

统计图的种类(统计图的种类及特点图片)

统计图是利用几何图形或具体事物的形象和地图等形式来表现社会经济现象数量特征和数量关系的图形。以下是几种常见的统计图类型及其适用场景:1.条形图(BarChart)条形图是用矩形条的高度或长度来表示...

实测,大模型谁更懂数据可视化?(数据可视化和可视化分析的主要模型)

大家好,我是Ai学习的老章看论文时,经常看到漂亮的图表,很多不知道是用什么工具绘制的,或者很想复刻类似图表。实测,大模型LaTeX公式识别,出乎预料前文,我用Kimi、Qwen-3-235B...

通过AI提示词让Deepseek快速生成各种类型的图表制作

在数据分析和可视化领域,图表是传达信息的重要工具。然而,传统图表制作往往需要专业的软件和一定的技术知识。本文将介绍如何通过AI提示词,利用Deepseek快速生成各种类型的图表,包括柱状图、折线图、饼...

数据可视化:解析箱线图(box plot)

箱线图/盒须图(boxplot)是数据分布的图形表示,由五个摘要组成:最小值、第一四分位数(25th百分位数)、中位数、第三四分位数(75th百分位数)和最大值。箱子代表四分位距(IQR)。IQR是...

[seaborn] seaborn学习笔记1-箱形图Boxplot

1箱形图Boxplot(代码下载)Boxplot可能是最常见的图形类型之一。它能够很好表示数据中的分布规律。箱型图方框的末尾显示了上下四分位数。极线显示最高和最低值,不包括异常值。seaborn中...