不同色彩空间的转换

当前,在计算机视觉中有三种常用的色彩空间:灰度、BGR以及HSV

1.灰度色彩空间是通过去除彩色信息来将其转换为灰阶,灰度色彩空间对中间处理特别有效,比如人脸检测

2.BGR,即蓝绿红色彩空间,每一个像素点都由一个三元组来表示

3.HSV,H(Hue)是色调,S(Saturation)是饱和度,V(value)表示黑暗的程度(或光谱另一端的明亮程度)

傅里叶变换

Numpy里有快速傅里叶变换(FFT)的包,它包含了fft2()函数,该函数可以计算一副图像的离散傅里叶变换(DFT)。

下面通过傅里叶变换来介绍图像的幅度谱。图像的幅度谱是另一种图像,幅度谱图像呈现了原始图像在变化方面的一种表示:把一幅图像中最明亮的像素放到图像中央,然后逐渐变暗,在边缘上的像素最暗。这样可以发现图像中有多少亮的像素和暗的像素,以及他们分布的百分比。

高通滤波器

高通滤波器是检测图像的某个区域,然后根据像素与周围像素的亮度差来提升该像素的亮度的滤波器

以如下的核kernel为例:

[[0,-0.25,0],

[-0.25,1,-0.25],

[0,-0.25,0]]

核是指一组权重的集合,他会应用在源图像的一个区域,并由此生成目标图像的一个像素。

在计算完中央像素与周围邻近像素的亮度的差值之和以后,如果亮度变化很大,中央像素的亮度会增加,反之则不会。

高通和低通滤波器都有一个称为半径的属性,它决定了多大面积的邻近像素参与滤波运算。

这些滤波器中的所有值加起来为0

import cv2
import numpy as np
from scipy import ndimage
kernel_3X3=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
kernel_5X5=np.array([[-1,-1,-1,-1,-1],[-1,1,2,1,-1],[-1,2,4,2,-1],[-1,1,2,1,-1],[-1,-1,-1,-1,-1]]) img=cv2.imread("1.jpg",0)
k3=ndimage.convolve(img,kernel_3X3)#卷积
k5=ndimage.convolve(img,kernel_5X5)#卷积 blurred=cv2.GaussianBlur(img,(11,11),0)
g_hpf=img-blurred
#两种高通滤波的效果
cv2.imshow("3x3",k3)
cv2.imshow("5x5",k5)
#通过对图像应用低通滤波器之后,与原始图像计算差值
cv2.imshow("g_hpf",g_hpf)
cv2.waitKey()
cv2.destroyAllWindows()

低通滤波器

低通滤波器(LPF)则是在像素与周围像素的亮度的亮度差值小于一个特定值时,平滑该像素的亮度。它主要用于去噪和模糊化。比如说,高斯模糊是最常用的模糊滤波器(平滑滤波器)之一,它是一个消弱高频信号强度的低通滤波器。

边缘检测

边缘在认类视觉和计算机视觉中均起着重要的作用

OpenCV提供了许多边缘检测滤波函数,包括Laplacian()、Sobel()以及Scharr()。这些滤波函数都会将非边缘区域转换为黑色,将边缘区域转为白色或其他饱和的颜色。但是这些函数都很容易将噪声错误地识别为边缘。缓解这个问题的方法是在找到边缘之前对图像进行模糊处理。OpenCV也提供了许多模糊滤波函数,包括blur()(简单的算术平均)、medianBlur()以及GaussianBlur()。边缘检测滤波函数和模糊滤波函数的参数有很多,但总会有一个ksize参数,它是一个奇数,表示滤波核的宽和高(以像素为单位)。

这里使用medianBlur()作为模糊函数,它对去除数字化的视频噪声非常有效,特别是去除彩色图像的噪声;使用Laplacian()作为边缘检测函数,他会产生明显的边缘线条,灰度图像更是如此。在使用medianBlur()函数之后,将要使用Laplacian()函数之前,需要将图像从BRG色彩空间转换为灰色色彩空间。

在得到Laplacian()函数的结果之后,需要将其转换成黑色边缘和白色背景的图像。然后将其归一化(使其像素值在0-1之间),并乘以源图像以便能将边缘变黑

用定制内核做卷积

OpenCV预定义的许多滤波器(滤波函数)都会使用核。其实核是一组权重,它决定如何通过邻近像素点来计算新的像素点。核也称为卷积矩阵,它对一个区域的像素做调和(mix up)或卷积运算。通常基于核的滤波器(滤波函数)被称为卷积滤波器(滤波函数)。

OpenCV提供了一个非常通用的filter2D()函数,它运用由用户指定的任意核或卷积矩阵。

cv.filter2D(src,-1,kernel,dst)

第二个参数指定了目标图像每个通道的位深度,如果为负值,则表示目标图像和源图像有同样的位深度。

对于彩色图像来说,filter2D()会对每个通道都用同样的核。如果要对每个通道使用不同的核,就必须用split()函数和merge()函数

Canny边缘检测

Canny边缘检测算法非常复杂,但也很有趣:它有5个步骤,即使用高斯滤波器对图像及逆行去噪、计算梯度、在边缘上使用非最大抑制(NMS)、在检测到的边缘上使用双阈值去除假阳性,最后还会分析所有的边缘及其之间的连接,以保留真正的边缘并消除不明显的边缘。

import cv2
import numpy as np
img=cv2.imread("1.jpg",0)
c=cv2.Canny(img,200,300)
cv2.imshow("canny",c)
cv2.waitKey()
cv2.destroyAllWindows()

轮廓检测

在计算机视觉中,轮廓检测是另一个比较重要的任务,不单是用来检测图像或者视频帧中物体的轮廓,而且还有其他操作与轮廓检测有关。这些操作有:计算多边形边界、形状逼近和计算感兴趣区域。这是与图像数据交互时的简单操作,因为Numpy中的矩形区域可以使用数组切片(slice)来定义。

import cv2
import numpy as np img=np.zeros((200,200),dtype=np.uint8)
img[50:150,50:150]=255
ret,thresh=cv2.threshold(img,127,255,0)
image,contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
color=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
img=cv2.drawContours(color,contours,-1,(0,255,0),2)
cv2.imshow("contours",color)
cv2.waitKey()
cv2.destroyAllWindows()

这段代码首先创建了一个200X200大小的黑色空白图像,接着在图像的中央放置一个白色方块,这里用到了np数组在切片上赋值的功能。

接下来对图像进行二值化操作,然后调用了findContours()函数。该函数有三个参数:输入图像,层次类型和轮廓逼近方法。它有几个方面特别有趣:

1.这个函数会修改输入图像,因此建议使用原始图像的一份拷贝

2.由函数返回的层次树相当重要:cv2.RETR_TREE参数会得到图像中轮廓的整体层次结构,以此来建立轮廓之间的“关系”。如果只想得到最外面的轮廓,可使用cv2.RETR_EXTERNAL。这对消除包含在其他轮廓中的轮廓很有用

findContours()函数有三个返回值:修改后的图像、图像的轮廓以及他们的层次。使用轮廓来画出图像的彩色版本,并显示出来。

OpenCV3计算机视觉+python(二)的更多相关文章

  1. 《OpenCV3 计算机视觉--Python语言实现 第二版》源代码及纠错

    1.源代码下载地址 <OpenCV3 计算机视觉--Python语言实现 第二版>由我们翻译,英文书名<Learning OpenCV3 Computer Vision with P ...

  2. OpenCV3计算机视觉Python语言实现笔记(二)

    1. 图像与原始字节之间的转换 从概念上讲,一个字节能表示0到255的整数.目前,对于多有的实时图像应用而言,虽然有其他的表示形式,但一个像素通常由每个通道的一个字节表示. 一个OpenCV图像是.a ...

  3. OpenCV3计算机视觉+python(三)

    使用OpenCV3处理图像 下面要介绍的内容都与图像处理有关,这时需要修改图像,比如要使用具有艺术性的滤镜.外插(extrapolate)某些部分.分割.粘贴或其他需要的操作. 不同色彩空间的转换 O ...

  4. OpenCV3计算机视觉Python语言实现笔记(四)

    1. Canny边缘检测 OpenCV提供了Canny函数来识别边缘.Canny边缘检测算法有5个步骤:使用高斯滤波器对图像进行去噪.计算梯度.在边缘上使用非最大抑制(NMS).在检测到的边缘上使用双 ...

  5. OpenCV3计算机视觉Python语言实现笔记(三)

    一.使用OpenCV处理图像 1.不同颜色空间的转换 OpenCV中有数百种关于在不同色彩空间之间转换的方法.当前,在计算机视觉中有三种常用的色彩空间:灰度.BGR以及HSV(Hue, Saturat ...

  6. opencv3计算机视觉+Python(一)

    基本I/O脚本 读/写图像文件 OpenCV的imread函数和imwrite函数能支持各种静态图像文件格式.不同系统支持的文件格式不一样,但都支持BMP格式,通常还应该支持PNG.JPEG和TIFF ...

  7. OpenCV3计算机视觉Python语言实现笔记(一)

    Python3下OpenCV的安装 :http://blog.csdn.net/lwplwf/article/details/61616493 1. 读/写图像文件 OpenCV的imread()函数 ...

  8. OpenCV3计算机视觉+Python(五)

    人脸检测和识别 本章将介绍Haar级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配.本章将考虑如何将多个Haar级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人 ...

  9. OpenCV3计算机视觉Python语言实现笔记(五)

    图像的几何变换主要包括:平移.扩大与缩小.旋转.仿射.透视等等.图像变换是建立在矩阵运算基础上的,通过矩阵运算可以很快的找到对应关系. 1. 图像的平移 图像的平移,沿着x方向tx距离,y方向ty距离 ...

随机推荐

  1. CSS3 not

    AND (&&): .registration_form_right input:not([type="radio"]):not([type="check ...

  2. hdu1584 A strange lift (电梯最短路径问题)

    A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  3. html5_websocket_tomcat8

    目录 前言 后端 浏览器前端 java的client 注意 前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,开销小,实时性高,常用于即时通讯和对信息实时性要求比较高的应用. 下面讲 ...

  4. nginx的luajit安装luarocks并安装luafilesystem

    nginx的luajit安装luarocks并安装luafilesystem by admin on -- :: in , 69次 标题有点绕口.我尽量把关键词都贴进去.之前因为自己的nginx安装了 ...

  5. [转]从输入url到页面加载完成的过程中都发生了什么事情

    第一个问题:从输入 URL 到浏览器接收的过程中发生了什么事情? 从触屏到 CPU 首先是「输入 URL」,大部分人的第一反应会是键盘,不过为了与时俱进,这里将介绍触摸屏设备的交互. 触摸屏一种传感器 ...

  6. Linux 后台任务

    1 我想把updatedb命令(用于重新建立整盘索引的命令)放在后台运行. # updatedb & [1] 23336 注释:在所要执行的命令后面加上空格,再加上&符号即可实现后台执 ...

  7. SecurCRT 远程linux 输入中文及 oracle 查询出文号问题

    一. 首先确认你的linux是否设置了支持中文 cat /etc/sysconfig/i18n 其中: LANG 变量是 language 的简称, 这个变量时决定系统的默认语言, 即系统菜单, 程序 ...

  8. 在linux下使用curl

    使用curl从 ftp下载文件 curl ftp://192.168.31.164/lrzsz-0.12.20.tar.gz --user root:123456 -o lrzsz-0.12.20.t ...

  9. marquee标签跑马灯连续无空白播放效果 纯CSS(chrome opera有效)

    marquee似乎没有设置首尾相连播放的属性,内容滚动时总会留出一段marquee本身长度的空隙,某些情况下很不方便: 捣鼓了一会,得出一种解决办法,关键有两点: 1.将需要滚动的内容复制一份于同一行 ...

  10. 关于height:100%不生效的问题

    当你设置一个页面元素的高度(height)为100%时,期望这样元素能撑满整个浏览器窗口的高度,但大多数情况下,这样的做法没有任何效果.你知道为什么height:100%不起作用吗? 按常理,当我们用 ...