1 不同色彩空间的转换

opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度、BRG、HSV(Hue-Saturation-Value)

  • 灰度 - 灰度色彩空间是通过去除彩色信息来将其转换成灰阶,灰度色彩空间对中间处理特别有效,比如人脸检测
  • BGR - 蓝-绿-红 彩色空间,每个像素点都由一个三元数组来表示,分别代表蓝-绿-红三种颜色。
  • HSV,Hue 表示色调,Saturation 表示饱和度,Value 表示黑暗的程度。

2 傅里叶变换

傅里叶变换的概念是许多常见的图像处理操作的基础,比如边缘检测或线段和形状检测。

2.1 高通滤波器

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

高通滤波器在边缘检测非常有效,它会采用一种称为高频提升滤波器(high boost filter)的高通滤波器。

首先给出一个例子

import cv2
import numpy as np
from scipy import ndimage

kernel_3 = np.array([
    [-1, -1, -1],
    [-1, 8, -1],
    [-1, -1, -1]
    ])

kernel_5 = 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('small.jpg', 0)
print(help(cv2.imread))

k3 = ndimage.convolve(img, kernel_3)
k5 = ndimage.convolve(img, kernel_5)

blurred = cv2.GaussianBlur(img, (11, 11), 0)
g_hpf = img - blurred

cv2.imshow('3*3', k3)
cv2.imshow('5*5', k5)
cv2.imshow('g_hpf', g_hpf)
cv2.waitKey()
cv2.destroyAllWindows()

运行可以得到如下图:

代码分析:

1)导入模块后,定义了核。

核,是指一组权重的积核,将它应用在源图像的一个区域,并由此生成目标图像。详见4 用定制内核做卷积

2)在cv2.imread()中的参数 0 。主要是将其转换为单通道灰度图像。详见 OpenCV 学习笔记 02 处理文件、摄像头和图形用户界面

cv2.IMREAD_GRAYSCALE = 0    如果设置,则始终将图像转换为单通道灰度图像。

3)对于给定核与图像的“ 卷积 convole ” 而言,numpy 在多维数组卷积运算时较为复杂(一维数组完成可以胜任),scipy 的 convolve() 函数可解决完美地解决该问题。

4)最后一种高通滤波器的实现方法有两步;第一步对图像应用低通滤波器,第二步再对与原始图像计算差值。

5)不难发现,第三种效果最好。

2.2 低通滤波器

高通滤波器是根据像素与临近像素的亮度差值来提升该像素的亮度;

低通滤波器(Low Pass Filter, LPF)的实现原理是在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度。该法主要应用于去噪和模糊化;其中,高斯模糊是最常用的模糊滤波器(平滑滤波器)之一,它是一个削弱高频信号强度的低通滤波器。

3 边缘检测

opencv 提供了许多边缘检测滤波函数,包括有Laplacian()、Sobel()、Scharr()等,这些滤函数都会将非边缘区域转为黑色,将边缘区域转为白色或其他饱和的颜色,不过这些函数很容易将噪声错误地识别为边缘,缓解该问题的方法就是找到边缘之前对图像进行模糊处理

  • Laplacian() - 它会产生明显的边缘线条,灰度图更是如此

opencv 提供了许多模糊滤波函数,包括有blur()(简单的算术平均)、medianBlur()、GaussianBlur()等。

  • medianBlur() - 对去除数字化的视频噪声非常有效,特别是去除彩色图像的噪声

边缘检测滤波函数和模糊滤波函数有必有一个参数 Ksize ,它是一个奇数,表示滤波核的宽和高(以像素为单位)。

注意:函数的使用顺序,模糊函数medianBlur() ---> 将图像从 BGR 色彩空间转为灰度色彩空间  ---> 边缘检测函数Laplacian()  ---> 将图像转换成黑色边缘和白色背景的图像  --->  将图像归一化处理(使它的像素值在0~1之间),并乘以源图像以便能将边缘变黑。

4 用定制内核做卷积

核也称为卷积矩阵,是一组权重,它作用于源图像的一个区域,并由此生成目标图像。

卷积矩阵的特点:

  • 是一个二维数组
  • 有奇数行、奇数列
  • 元素值是整数或浮点数。
  • 中心的元素对应于感兴趣的像素,其他元素对应于这个像素周围的临近像素

示例

kernel = numpy.array([
    [-1, -1, -1],
    [-1,  9, -1],
    [-1, -1, -1]])

示例中感兴趣的像素权重为 9 ,其临近像素权重为 -1,当进行卷积计算时,对感兴趣的像素来说,新像素值是用当前像素值乘以9,然后减去8个临近像素值;以拉大该点像素值与临近像素值之间的差距,让图像更锐化。

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

filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst

参数:

  • src - 输入图像
  • ddepth - 目标图像每个通道的位深度,若为负值,则表示目标图像与源图像由同样的位深度。位深度 cv2.CV_8U 表示每个通道为 8 位。
  • kernel - 卷积核,单通道浮点矩阵,若要应用于不同的通道,需使用拆分将图像拆分为单独的颜色平面,然后单独处理它们。
  • dst - 输出与 src 相同大小核相同通道的图像
  • anchor - 内核的锚点,指示内核中过滤点的相对位置,锚应位于内核中,默认值(-1, -1),表示锚位于内核中心。
  • delta - 在将它们存储在dst中之前,将可选值添加到已过滤的像素中。
  • borderType - 像素外推法

对于多通道彩色图像来说,filter2D 会对每个通道都用同样的核,若每个通道都使用不同的核,则需用 split() 函数和 merge() 函数。

备注:

卷积核权重加起来为 1 ,则不会改变图像的亮度。可以达到模糊效果,

卷积核权重加起来为 0,则会使图像更加锐化。也可称之为边缘检测核,边缘转为白色,非边缘区域转为黑色。

5 Canny 边缘检测

opencv 提供了一个非常方便的 Canny 函数。

Canny 边缘检测算法非常复杂,共计有 5 个步骤。

使用高斯滤波器对图像进行去噪、计算梯度、在边缘上使用非最大抑制(NMS)、在检测到的边缘上使用双阈值去假阳性(false positive),最后还会分析所有的边缘及其之间的连接,以保证真正的边缘并消除不明显的边缘。

import cv2

img = cv2.imread('small.jpg', 0)
cv2.imwrite('canny.jpg', cv2.Canny(img, 200, 300))
cv2.imshow('canny', cv2.imread('canny.jpg'))
cv2.waitKey()
cv2.destroyAllWindows()

运行

6 轮廓检测

轮廓检测不单是用来检测图像或者视频帧中物体的轮廓,而且还有计算多边形边界、形状逼近和计算感兴趣区域等与轮廓检测有关的操作。

OpenCV 学习笔记 02 使用opencv处理图像的更多相关文章

  1. OpenCV学习笔记:resize函数改变图像的大小

    OpenCV提供了resize函数来改变图像的大小,函数原型如下: , , int interpolation=INTER_LINEAR ); 参数解释: src:输入,原图像,即待改变大小的图像: ...

  2. OpenCV 学习笔记 01 安装OpenCV及相关依赖库

    本次学习是基于Window10进行的.语言为python3. 1 与opencv相关的库简介 1.1 numpy numpy 是 OpenCV 绑定 python 时所依赖的库,此意味着numpy在安 ...

  3. OpenCV学习笔记一:OpenCV概览与配置编译

    一,OpenCV OpenCV官方网站:http://opencv.org/  OpenCV目前最新代码库地址:https://github.com/itseez/opencv 二,简介: OpenC ...

  4. 【opencv学习笔记一】opencv下载安装与VS2017开发环境配置

    本文章摘录自浅墨博客,原文链接http://blog.csdn.net/poem_qianmo/article/details/19809337 目录 1.opencv下载与安装 2.计算机环境变量配 ...

  5. OpenCV 学习笔记 02 处理文件、摄像头和图形用户界面

    在处理文件前需要引入OpenCV库,同时也引入unmpy库 import cv2 import numpy as np 1 基本的读写操作 1.1 图像文件的读写操作 1.1.1 图像文件的读取操作 ...

  6. 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起

    话说,平凡之处显真格,这一点也没错!  比如,对旋转图像进行双线性插值,很简单吧?  可,对我,折腾了大半天,也没有达到预期效果!  尤其是三个误区让我抓瞎好久: 1,坐标旋转公式.   这东西,要用 ...

  7. opencv学习笔记(03)——遍历图像(迭代器法)

    #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp> #include & ...

  8. opencv学习笔记(01)——操作图像的像素

    #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <ope ...

  9. Opencv学习笔记5:Opencv处理彩虹图、铜色图、灰度反转图

    一.概述: 人类能够观察到的光的波长范围是有限的,并且人类视觉有一个特点,只能分辨出二十几种灰度,也就是说即使采集到的灰度图像分辨率超级高,有上百个灰度级,但是很遗憾,人们只能看出二十几个,也就是说信 ...

随机推荐

  1. .NET Framework 工具

    您可以使用 .NET Framework 工具轻松创建.部署和管理面向 .NET Framework 的应用程序和组件. 此节中介绍的大部分 .NET Framework 工具将自动随 Visual ...

  2. jquery旋转图片

    今天介绍一款 jQuery 插件——jqueryrotate,它可以实现旋转效果.jqueryrotate 支持所有主流浏览器,包括 IE6.如果你想在低版本的 IE 中实现旋转效果,那么 jquer ...

  3. bootstrap——强大的网页设计元素模板

    本文介绍一个网页设计工具——bootstrap,它包含了很多华丽的按钮及排版,我们可以在网页设计中直接使用它,尤其是加入我们只是想简单的使用一下的话,将会是一个不错的选择,下面是几张examples, ...

  4. MDX Step by Step 读书笔记(九) - Working with Time 处理时间

    开篇介绍 这一章节主要用到的 MDX 函数: PeriodsToDate( [Level , [Member]] ) - 从指定级别的范围内,返回与指定成员同一级别,从第一个期间开始到指定成员结束的期 ...

  5. bootstrap设计站点中加入代码高亮插件

    这款插件的名字叫做google-code-prettify 使用该插件之前的效果: 使用插件之后的效果: 接下来说步骤: (1)下载两个文件 http://codecloud.sinaapp.com/ ...

  6. 路由器mtu值设置

    MTU=最大传输单元 单位:字节 英文:Maximum Transmission Unit”我们平时上网时的各种操作,都是通过一个又一个“数据包”传输来实现的.而MTU指定了网络中可传输数据包的最大尺 ...

  7. CentOS yum时出现"Could not retrieve mirrorlist"

    问题描述: CentOS 6.x minimal(最小化) 安装, CentOS yum install net-tools 时出现"Could not retrieve mirrorlis ...

  8. 每天五个java相关面试题(7)--线程篇

    首先关于线程能够先看我之前这篇博文熟悉一下线程生命周期的图示以及文字说明 好開始了: 1.java 中有几种方法能够实现一个线程? 答:有两种实现方法.各自是继承 Thread类与实现Runnable ...

  9. 【PMP】三点估算法

    通过考虑估算中的不确定性和风险,可以提高持续时间估算的准确性. 最可能时间(tM):基于最可能获得的资源.最可能取得的资源生产率.对资源可用时间的现实预计,资源对其他参与者的可能依赖关系及可能发生的各 ...

  10. java if语句

    //if语句 //Test10.java import java.util.Scanner; public class Test16{ public static void main(String[] ...