
图像处理与OpenCV
saltriver
You're On Your Own.
展开
-
数字图像的加载、显示和输出
图像处理的最基本工作,也是第一步工作:读取、显示和输出图片。1.图像读取opencv图像读取的函数是:imread(图像路径,加载模式);输入参数有2个:“图像路径”是一个字符串;使用绝对路径和相对路径都是可以的,但相对路径必须是程序的工作路径。一般的图像格式都是支持的,如bmp,jpg,png,tiff等。“读取模式”是一个枚举型的整数,用于指定读取图像的颜色类型。缺省值是1,一般在调用时我们原创 2017-10-06 22:02:17 · 2163 阅读 · 1 评论 -
微分算子为什么也是空间滤波器
前面我们提到,可以用一阶微分算子和二阶微分算子来增强图像,由于是增强了图像中的物体边缘轮廓,起到了锐化图像的效果,因此这些算子操作可用于图像锐化。我们在前面的图像模糊中,介绍了使用平滑空间滤波器来模糊图像,那么用微分算子来锐化图像能不能也使用空间滤波器的形式呢?我们分别选一个一阶微分算子和一个二阶微分算子作为示例:Sobel算子和Laplacian算子。首先,还是给出图像像素的8领域:原创 2018-01-06 18:25:03 · 2853 阅读 · 5 评论 -
图像二阶导数的本质
前面我们介绍过了图像的二阶导数,并且指出,二阶导数比一阶导数有更好的细节增强表现。那么,其原理是什么呢?我们仍然简化问题,考虑下x方向,选取某个像素,如下图所示: 可以看出,在图中标红色框框的像素附近是一个明显的分界线,上面是一片平坦的灰度区域,下面是灰度缓慢变化的区域。而且有着明显的灰度突变:从100突变到50。我们可以把这个看作图像中物体的轮廓边缘。根据前几篇文章的介绍,图像在x原创 2018-01-06 18:01:32 · 20080 阅读 · 18 评论 -
彩色图像怎样转灰度图像
我们日常的环境通常获得的是彩色图像,很多时候我们常常需要将彩色图像转换成灰度图像。也就是3个通道(RGB)转换成1个通道。(1)平均法 最简单的方法当然就是平均法,将同一个像素位置3个通道RGB的值进行平均。 I(x,y) = 1/3 * I_R(x,y) +1/3 * I_G(x,y)+ 1/3 * I_B(x,y)原始图像: import cv2import nump...原创 2018-03-24 13:31:14 · 91732 阅读 · 17 评论 -
图像增强之对比度拉伸
我们前面提到过图像二值化,图像反转,本质上是对图像的所有像素点的灰度进行操作,属于灰度变换的内容。灰度变换的主要目的是用于图像增强。而对比度拉伸是图像增强的一种方法,也属于灰度变换操作。我们看如下图像: 可以看到,这张图片非常灰暗。我们查看下其直方图。import cv2import matplotlib.pyplot as pltfarina = cv2.imread(...原创 2018-03-24 13:39:59 · 37051 阅读 · 18 评论 -
图像的缩放变换
在日常工作中,我们经常需要对图像进行缩放(放大、缩小),旋转、平移等各种操作,这类操作统称为图像的几何变换。相对于前面提到的灰度变换,几何变换是改变了原图像像素点在新图像中的空间位置。我们首先来看看图像缩放操作。假设一幅图像是100×100像素大小,放大一倍后是200×200大小。图像中的每一个像素点位置可以看作是一个点,也可以看作是二维平面上的一个矢量。图像缩放,本质上就是将每个像素点的矢量...原创 2018-03-24 17:46:04 · 14817 阅读 · 5 评论 -
图像旋转变换的推导
前面我们提到了图像的缩放变换,可以用矩阵乘法的形式来表达变换后的像素位置映射关系。那么,对于旋转变换呢?我们可以同样将其想象成二维平面上矢量的旋转。如下图所示,矢量[x1,y1]逆时针旋转θθθ度到了[x2,y2]。 设定矢量的长度为s,根据坐标系定义,我们可以得到: x2=s∙cosβx2=s•cosβx2=s• cosβy2=s∙sinβy2=s•sinβy2=s• ...原创 2018-03-24 17:56:47 · 5679 阅读 · 2 评论 -
为什么要引入齐次坐标
前面我们提到了图像的缩放变换和旋转变换,可以用矩阵乘法的形式来表达变换后的像素位置映射关系。那么,对于平移变换呢?平移变换表示的是位置变化的概念。如下图所示,一个图像矩形从中心点[x1,y1]平移到了中心点[x2,y2]处,整体大小和角度都没有变化。在x方向和y方向上分别平移了tx和ty大小。 显然: x2=x1+txx2=x1+txx2 = x1 + txy2=x2+tyy2=x2...原创 2018-03-24 18:20:03 · 11322 阅读 · 11 评论 -
图像“颜色选择”怎么用?
我们来看一个简单的需求,比如说下面这幅图像: 这是一幅公路上的行车图像,假如我们想把车道线提取出来,该怎么办呢?我们观察,发现车道线是黄色的或者白色的。那么我们想到的是可以把行车图像中的黄色颜色和白色颜色提取出来。我们知道,在RGB颜色模式中,白色是[255,255,255],黄色是[255,255,0]。但是行车图像中的白色和黄色可不完全是纯白色和纯黄色。因此,需要在一定的范围内...原创 2018-03-24 19:40:59 · 2611 阅读 · 2 评论 -
图像“位操作”有什么用?
我们在看优酷视频时,经常会发现视频右上角上有“优酷”的字样。例如: 实际上我们可以把视频看作一幅幅的图像,在每幅图像中,我们把“优酷”这个图标加上去。于是一个很自然的想法就是图像相加。由于图像相加需要2幅图像有相同的大小,因为图像就是矩阵,同维度的矩阵才能相加。于是先生成一副有“优酷”字样的黑色背景的图像,让其与每幅图像进行相加。 import cv2car = cv2.i...原创 2018-03-24 19:47:02 · 2988 阅读 · 3 评论 -
选择图像的“感兴趣区域”
我们在前面的文章《图像的颜色选择》中提到,如下的行车图像,要提取黄色和白色的车道线,通过颜色选择,分别得到了黄颜色的区域和白颜色的区域。下图分别是原始行车图像,白颜色位置图像,黄颜色位置图像: 我们可以用前面提到的《图像位操作》将白颜色位置和黄颜色位置叠加起来。这里就用到了bitwise_or的位操作。import cv2white = cv2.imread("whi...原创 2018-03-24 19:54:40 · 10506 阅读 · 6 评论 -
图像的颜色是什么
我们都知道图像是有颜色的,最常见的颜色表达方式就是RGB,Red(红)、Green(绿)、蓝(Blue),也就是常说的三通道(channel)或者三分量。那么到底什么是颜色呢?有人会说我们看到的物体呈现的红、橙、黄、绿、蓝、紫就是颜色啊。那我们进一步问?为什么晚上在房间里什么颜色都看不见,桌子上的水果盘中,苹果没有呈现出红色,桔子也没有呈现出橙色啊?答案得从物理世界中找,那就是电磁波,更精...原创 2018-03-24 20:00:17 · 3721 阅读 · 0 评论 -
图像的边缘检测
我们先看几幅简单的图像: 这3幅图像,都只有极其简单的线条,组成了物体的轮廓,我们人一看就知道是什么物体。也就是说,我们人类视觉通过物体边缘就能够做到识别物体。因此,物体边缘是图像中最基本也是最重要的特征,图像分析、识别、理解的第一步就是边缘检测。那么,什么是边缘呢?很遗憾,尽管边缘在图像处理中有着极其重要的作用,但好像并没有严格精确的定义。一般认为:两个具有不同灰度的均匀图像区域的边界...原创 2018-06-02 09:54:01 · 21642 阅读 · 3 评论 -
Canny边缘检测
Canny边缘检测是一种非常流行的边缘检测算法,是John Canny在1986年提出的。它是一个多阶段的算法,即由多个步骤构成。1.图像降噪 2.计算图像梯度 3.非极大值抑制 4.阈值筛选我们就事后诸葛亮,分析下这个步骤的缘由。首先,图像降噪。我们知道梯度算子可以用于增强图像,本质上是通过增强边缘轮廓来实现的,也就是说是可以检测到边缘的。但是,它们受噪声的影响都很大。那么,我...原创 2018-06-02 10:08:37 · 96523 阅读 · 9 评论 -
图像二阶导数的推导
前面我们介绍过了图像的梯度,以及图像的几个梯度算子。这些本质上都是一阶导数,或一阶微分。就是求图像灰度变化的导数,能够突出图像中的对象边缘。那有一阶导数,有没有二阶导数呢?求导数的导数,这对灰度变化强烈的地方会更敏感。在微积分中,一维函数的一阶微分的基本定义是这样的:dfdx=limϵ→0f(x+ϵ)−f(x)ϵ\frac{df}{dx}=\lim_{\epsilon\righta原创 2018-01-06 17:54:36 · 16691 阅读 · 11 评论 -
图像梯度算子的本质
前面我们介绍过图像的梯度,其定义是根据微积分的定义在二维离散函数中推导出来的。但是,我们需要理解,梯度只是一个工具,方法,核心目的是得到像素点与其相邻像素的灰度值变化情况,并通过这种变化来增强图像。这种原始定义的梯度只是这种灰度值变化情况的度量工具。我们再回顾一下,假设某像素与其8领域用如下矩阵表示: 那么,根据图像梯度的定义: gx = z8 - z5 gy = z6 -原创 2018-01-06 10:45:13 · 15089 阅读 · 14 评论 -
图像梯度的基本原理
前面我们提到,当用均值滤波器降低图像噪声的时候,会带来图像模糊的副作用。我们当然希望看到的是清晰图像。那么,清晰图像和模糊图像之间的差别在哪里呢?从逻辑上考虑,图像模糊是因为图像中物体的轮廓不明显,轮廓边缘灰度变化不强烈,层次感不强造成的,那么反过来考虑,轮廓边缘灰度变化明显些,层次感强些是不是图像就更清晰些呢。那么,这种灰度变化明显不明显怎样去定义呢。我们学过微积分,知道微分就是求函数的变化原创 2018-01-06 10:37:22 · 87154 阅读 · 66 评论 -
为什么matplotlib显示opencv图像不正常
在前面的《数字图像的加载、显示和输出》中提到,opencv对多个图片输出在同一个窗口并没有直接的支持手段,但有时候我们会有这个需求,这时可以用matplotlib搭配使用。下面将4张图片放在一个窗口中显示。原始图像如下: 使用matplotlib将4幅图像显示在一个窗口的代码如下:# coding=utf-8import cv2import matplotlib.pyplot as plt原创 2017-10-08 09:41:13 · 19044 阅读 · 2 评论 -
为什么OpenCV3在Python中导入名称是cv2
我们来看一下:import cv3print(cv3.__version__)输出报错:Traceback (most recent call last):ImportError: No module named 'cv3'再来看看:import cv2print(cv2.__version__)输出:3.3.0为什么OpenCV3在Python中包名称是cv2,而不是cv3?实际上,”cv2”原创 2017-10-06 17:02:57 · 22652 阅读 · 11 评论 -
图像就是函数
计算机视觉旨在从图像中提取有用的信息,这已经被证实是一个极具挑战性的任务。那么图像是什么?或者说我们把图像看作什么?有人说图像就是一张图片,一个场景,一个矩形(rectangle),一个矩阵(matrix)。我们先看一个图像实例: 这是一张黑白图像,也就是常说的灰度图。更多的图像是彩色的RGB图像。灰度图处理起来更加简单方便,因此这里使用灰度图像,重在理解。我们把这幅图像加上坐标刻度,如下图所示:原创 2017-12-19 22:07:35 · 5956 阅读 · 11 评论 -
图像就是矩阵
学过线性代数的对矩阵并不陌生。一般来说,图像是一个标准的矩形,有着宽度(width)和高度(height)。而矩阵有着行(row)和列(column),矩阵的操作在数学和计算机中的处理都很常见且成熟,于是很自然的就把图像作为一个矩阵,把对图像的操作转换成对矩阵的操作,实际上所有的图像处理工具都是这么做的。我们看看下面这张图像:用opencv读取:import cv2mountain = cv2.i原创 2017-12-23 22:26:43 · 35428 阅读 · 13 评论 -
图像为什么能相加
我们知道2个矩阵是可以执行加法运算的,那2个图像能不能相加呢?当然是可以的。前面提到,图像就是函数,函数可以相加,图像当然也可以相加。我们知道2个矩阵相加必须是同一维度的,即行列相同,图像当然也一样,即宽度和高度相同。我们看下面2副图像: import cv2boats = cv2.imread("boats.bmp", 0)goldhill = cv2.imread("goldhill.bm原创 2017-12-23 22:34:18 · 3655 阅读 · 5 评论 -
给图像添加噪声
如果你把图像看作信号,那么噪声就是干扰信号。我们在采集图像时可能因为各种各样的干扰而引入图像噪声。前面提到,我们可以把图像看作一个函数,那么带有噪声的图像,就可以看作是原始图像函数与噪声函数相加的和。 f(x, y) = I(x, y) + noise常见的噪声有椒盐噪声(salt and pepper noise),为什么叫椒盐噪声?因为图像的像素点由于噪声影响随机变成了黑点(dark spot原创 2017-12-23 22:38:26 · 31923 阅读 · 3 评论 -
图像为什么能相减
前面提到,我们可以把图像看作一个函数,函数和函数之间是可以相加的。 f(x,y)=I1(x,y)+I2(x,y)f(x, y) = I_1(x, y) + I_2(x, y) 那么,既然函数可以相加,函数也是可以相减的。所以,图像之间是不是也能相减呢?答案是肯定的。我们知道10-8=2,表示8和10之间的差别是相差2。那么图像相减同样是用于表示图像之间的差别。在冈萨雷斯的《数字图像处理》书中,介原创 2017-12-23 22:41:10 · 5007 阅读 · 0 评论 -
图像平均操作为什么能降噪
前面提到,带有噪声的图像可以看作原始图像函数与噪声函数的和。 f(x,y)=I(x,y)+Noise(x,y)f(x, y) = I(x, y) + Noise(x, y)那么我们怎样从带有噪声的图像f(x, y)中去掉Noise得到I(x, y)呢?很自然的能想到,既然能加上噪声函数,那么把噪声函数减去不就行了。是这样的,当然可以这样想。但是,绝大多数时候我们并不知道噪声函数是怎样的,即使知道噪原创 2017-12-24 10:41:23 · 9280 阅读 · 6 评论 -
为什么用加权平均来降噪
前面提到,我们想到了用平均操作来降低噪声。降低噪声的意义是显而易见的,当我们需要图像增强,以提升图像的质量时,必须降低甚至消除噪声。用平均操作来降低噪声是一种好方法,其基于的原理是:每个像素点的值与其周边像素点的值比较接近。但是,我们进一步分析,如果一个像素点的值没有被噪声污染,那么用这种操作就改变了像素点的真实值,带来了副作用。同时,在像素点的8领域周边像素中,其水平和垂直方向的4领域像素与中心像原创 2017-12-24 10:45:41 · 2864 阅读 · 2 评论 -
空间滤波器是怎么来的
前面提到,我们可以用平均或加权平均来降低噪声,以增强图像。前面我们是对像素点的周边8领域进行的操作,要是我们想对周边更多领域进行操作呢?如果我们想要调整加权的权重值呢?那么用前2篇文章中的方法显然是非常烦琐且不灵活的。我们注意到,对8领域进行平均或加权平均操作,实质上是对3×3的一个矩形区域进行操作。如果相邻像素再扩大一圈,就是5×5的矩形区域: 我们前面说:图像就是矩阵,那么这个相邻像素构成的区原创 2017-12-24 10:58:07 · 4979 阅读 · 4 评论 -
图像模糊有什么用
我们前面提到,使用平均操作或加权平均操作可以降低图像的噪声,并由此引出了空间滤波器的概念。这种平均操作或加权平均操作的空间滤波器,根据平均操作的特点,可以叫做均值滤波器;其主要应用就是降低噪声,根据应用的特点,也可以叫做平滑滤波器。我们再次感受下这种均值滤波器或平滑滤波器的作用。下面是一张哈勃望远镜拍摄的星空原始图像(来自冈萨雷斯的《数字图像处理),我们将这张图像和使用平滑滤波器后生成的图像进行一下原创 2017-12-24 11:03:08 · 13476 阅读 · 12 评论 -
中值滤波器
我们前面提到,使用平均操作或加权平均操作可以降低图像的噪声,并由此引出了空间滤波器的概念。这种平均操作或加权平均操作的空间滤波器,根据平均操作的特点,可以叫做均值滤波器。均值,就是平均值得意思。我们在《统计学-掌握数据的总体状态》 中知道,对数据的统计有平均值,还可以有中位数。例如一组数:50,60,17,6,80,90,25。其平均值是:(50+60+17+6+80+90+25)/=46.86。而原创 2017-12-24 11:08:59 · 6235 阅读 · 1 评论 -
高斯模糊
我们前面提到,可以使用加权平均操作来降低图像的噪声,其基本原理就是按照领域像素的重要程度来进行加权。那这个加权平均的滤波器是怎样的呢?我们可以构建如下的加权平均滤波器:离中心点越近的权值比越远的权值要高,但这个滤波器的尺寸太小,通常很难看出区别,而且更重要的是权重大小的设置比较繁琐。我们知道,高斯函数呈现出的特征就是中间高,两边低的钟形。下图是二维高斯函数的可视化图形:能不能利用高斯函数的这种性质,原创 2017-12-24 11:13:00 · 2045 阅读 · 1 评论 -
图像的统计方法
前面我们提到,用均值滤波器、中值滤波器、高斯滤波器等可以降低图像中的噪声,其副作用是带来了图像模糊。我们降低噪声的目的,当然是为了提高图像的质量,这是“图像增强”的一个重要应用。那图像质量怎么评价呢?这是个不同人有不同见解,比较主观的事情。图像增强从一开始就是建立在特定问题的基础上的。对于不同的特定问题,就需要不同的图像增强方法,其增强后的图像质量当然评价标准也不一样。因此,并不存在“通用”的原创 2018-01-06 10:01:58 · 5025 阅读 · 1 评论 -
Hough直线检测的理解
我们在前面的《图像的颜色选择》、《图像的感兴趣区域》中提到了对车道线的检测。 通过对原始行车图像进行颜色选择和感兴趣区域的提取,得到了如下的车道线: 我们的车道线当然是一左一右两条线。那怎样从这个车道线图像中提取出这2条线呢?这就要谈到“霍夫变换(Hough Transfrom)”。霍夫变换是1972年提出来的,最开始就是用来在图像中过检测直线,后来扩展能检测圆、曲线等。我...原创 2018-06-02 13:35:51 · 24379 阅读 · 5 评论