2. 使用OpenCV3处理图像

2.1 不同色彩空间的转换

OpenCV中有数百种关于在不同色彩空间之间转换的方法。

三种常用色彩空间:灰度、BGR、HSV(Hue色调,Saturation饱和度,Value亮度)

注:计算机遵从加色模型,而绘画遵从减色模型。

2.2 傅里叶变换

傅里叶变换作用:可以用来区分图像里哪些区域的信号变化特别强,哪些不那么强,

从而可以任意标记噪声区域、感兴趣区域、前景和背景。

幅度谱(magnitude spectrum):图像的幅度谱是另一种图像,幅度谱图像呈现了

原始图像在变化方面的一种表示:把一幅图像中最亮的像素放中间,然后逐渐变暗,

在边缘上的像素最暗。这样可以发现图像中有多少亮的像素和暗的像素,以及他们

分布的百分比。

2.2.1 高通滤波器(HPF)

知识准备:核是指一组权重的组合,它会应用的在源图像的一个区域,并由此产生目标图像的一个像素。

比如:大小为7的核意味着每49(7*7)个源图像的像素会产生目标图像的一个像素。

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("../images/statue_small.jpg", 0)
# 卷积运算
k3 = ndimage.convolve(img, kernel_3x3)
k5 = ndimage.convolve(img, kernel_5x5)
# 高斯模糊(一种低通滤波器)
blurred = cv2.GaussianBlur(img, (17,17), 0)
g_hpf = img - blurred cv2.imshow("3x3", k3)
cv2.imshow("5x5", k5)
cv2.imshow("g_hpf", g_hpf)
cv2.waitKey()
cv2.destroyAllWindows()

2.2.2 低通滤波器

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

低通滤波器则是在像素与周围像素的亮度差值小于一个特定值时,平均该亮度的像素。

它主要用于去噪和模糊化,比如说,高斯模糊是最常用的模糊滤波器(平滑滤波器)之一,

它是一个削弱高频信号强度的低通滤波器。

2.3 创建模块

2.4 边缘检测

OpenCV提供了许多边缘检测滤波函数,包括Laplacian()、Sobel()以及Scharr()。这些

滤波函数都会将非边缘区域转换成黑色,将边缘区域转换成白色或者其它饱和的颜色。

但是,这些函数都很容易将噪声错误地识别为边缘。

缓解这个问题地办法是在找到边缘之前对图像进行模糊处理。

OpenCV提供了许多模糊滤波函数,包括blur()(简单地算术平均)、medianBlur()以及

GaussianBlur()。边缘检测滤波函数和模糊滤波函数的参数有很多,但总会有个ksize参数,

它是一个奇数,表示滤波核的宽和高(以像素为单位)。

这里使用medianBlur()作为模糊函数,它对去除数字化的视频噪声非常有效,特别是去除

彩色图像的噪声;使用Laplacian()作为边缘检测函数,它会产生明显的边缘线条,灰度图像

更是如此。在使用medianBlur()函数之后,将要使用Laplacian()函数之前,需要将图像从BGR

色彩空间转换为灰度色彩空间。

在得到Laplacian()函数的结果之后,需要将其转换成黑色边缘和背景的图像。然后将其

归一化(使它的像素值在0到1),并乘以源图像以便能使边缘变黑。

def strokeEdges(src, dst, blurKsize = 7, edgeKsize = 5):
if blurKsize >=3:
blurredSrc = cv2.medianBlur(src, blurKsize)
graySrc = cv2.cvtColor(blurredSrc, cv2.COLOR_BGR2GRAY)
else:
graySrc = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
cv2.Laplacian(graySrc, cv2.CV_8U, graySrc, ksize = edgeKsize)
normalizedInverseAlpha = (1.0/255)*(255-graySrc)
channels = cv2.split(src)
for channel in channels:
channel[:] = channel*normalizedInverseAlpha
cv2.merge(channels, dst)

注:对于较大的ksize(包括7),使用medianBlur()的代价很高。

2.5 用定制内核做卷积

Opencv-Python学习笔记(二)的更多相关文章

  1. python学习笔记(二)、字符串操作

    该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...

  2. 播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二

    今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ...

  3. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

  4. (10.1)Python学习笔记二

    1.在项目工程中要模块化测试一个开发的功能,在测试通过后交付给项目组其他人员继续开发.要保证代码开发的性能和效率以及可扩展性. 2.项目工程中的文件夹分类要功能模块明确清晰,在python中引入某一个 ...

  5. OpenCV for Python 学习笔记 二

    今天主要看了OpenCV中的事件以及回调函数,这么说可能不准确,主要是下面这两个函数(OpenCV中还有很多这些函数,可以在 http://docs.opencv.org/trunk/modules/ ...

  6. Python学习笔记二

    ---恢复内容开始--- 一. python几种数据类型的比较. 从以下几个方面比较: 1. 是否可变. 不可变类型:变量的值可以发生变化,id也变了,相当于创建了一个新的对象,所以一修改值,id就变 ...

  7. Python学习笔记(二)

    标识符和关键字 1,邮箱的Python标识符是任意长度的非空字符序列(引导字符+后续字符.) python标识符必须符合两条规则--标识符区分大小写 (1)只要是unicode编码字母都可以充当引导字 ...

  8. python学习笔记(二):python数据类型

    上一篇博客写了python的入门和简单流程控制,这次写python的数据类型和各种数据类型的内置方法.一.数据类型是什么鬼?计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各 ...

  9. python学习笔记二:流程控制

    一.if else: #!/usr/bin/python x = int(raw_input('please input:')) if x >= 90: if x >= 95: print ...

  10. python 学习笔记二 (列表推导式)

    2018年年初写了第一篇博客,说要做一个认真的技术人 https://www.cnblogs.com/yingchen/p/8455507.html 今天已经是11月19日了,这是第二篇博客,看来坚持 ...

随机推荐

  1. python_项目_ATM和购物商城的程序

    1 需求 模拟实现一个ATM + 购物商城程序 额度15000或自定义 实现购物商城,买东西加入购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 ...

  2. Hibernate查询部分字段并封装到指定类中

    Hibernate 使用查询部分/指定字段,有几种字现方式: 第一种方式是通过HQL语句实现,类似SQL,方法如下: String hql = "select id,name from Li ...

  3. Java中的“==操作符”和equals方法有什么区别

    Java中的"=="和equals方法究竟有什么区别? 1.==操作符 "=="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的 ...

  4. Pyrit help

    Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Morahttps://github.com/JPaulMora/PyritThis code is ...

  5. Preloading Your ASP.NET Applications

    You may have noticed that the first request to an ASP.NET Web site takes longer than subsequent requ ...

  6. vb程序安装时需要在客户端安装MSSOAP30.dll,但注册不上,请问怎么处理

    現在想打包发布,在客戶沒有這個控件時,注冊一下,主要是不想在客户机器上安装SoapToolkit30.EXE文件 ?? 推荐解决方案 如果使用 InstallShield 工具来打包,安装完MSSOA ...

  7. Java XML DOM解析范例源码

    下边内容内容是关于Java XML DOM解析范例的内容.import java.io.InputStream; import java.util.ArrayList; import java.uti ...

  8. python类特列方法使用

    class Rgc(object): def __new__(cls, *args, **kwargs): print('在类通过__new__方法实例化一个对象') return super(Rgc ...

  9. Python PEP8 编码规范

    代码编排 缩进.缩进4个空格,不能混合使用Tab和空格. 每行最大长度79,文档字符串和注释行最大长度为72,换行可以使用反斜杠,最好使用圆括号. 类和顶层函数定义之间空两行:类中的方法定义以单行分隔 ...

  10. jquery 防止当前页面被Iframe嵌套,防止登录页面Iframe被嵌套

    <script type="text/javascript"> if (top.location != location) { top.location.href = ...