OpenCV入门笔记(三) 图片处理
OpenCV中提供了非常多处理图片的强大函数,能够对非常多格式的图片 加特效。有点实现Photoshop里的工具的感觉。 以下先介绍一些简单和常见的特效。
二值化(Image Threshold)
參考这里:Image Processing
二值化仅仅能处理灰度图。而所谓的灰度图。就是一幅仅仅用 0-255 这个范围来表示每个像素点的图像。灰度图没有色彩信息,看起来灰萌灰萌哒;可是又不全然仅仅有黑白两种颜色。
二值化,顾名思义,就是把灰度图的0-255的范围,映射到 0 和 1 两个值上。最简单的做法,便是先设置一个阈值(threshold),比方叫 t 好了。当灰度图完毕了的像素值 g < t。则赋值为 1,否则为 0. 这样就完毕了二值化。
二值化的效果,是能够将物体和背景切割出来,原理是让物体和背景的像素间方差最大。
highlight=threshold#cv2.threshold">Threshold函数
简单的全局二值化函数,使用方法例如以下
ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
參数
- img 是要二值化的图片
- 127 表示阈值。这里我们用中位数表示。
- 255 表示大于阈值。便给该像素赋这个值。
- cv2.THRESH_BINARY 表示要用的二值化方法。取值例如以下
- cv2.THRESH_BINARY
- cv2.THRESH_BINARY_INV
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2.THRESH_TOZERO_INV
返回值
- ret 貌似会返回127。不知道有什么用
- thresh 二值化以后的图片
AdaptiveThreshold函数
前面的全局二值化函数,用的阈值仅仅有一个。可是这样往往效果不是非常好,所以有了自适应的局部二值化算法。
adaptive = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
參数
- img 要处理的灰度图
- 255 大于阈值后要赋的值
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C 要用的自适应二值化方法
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C
高斯法- cv2.ADAPTIVE_THRESH_MEAN_C
平均法- cv2.THRESH_BINARY 表示阈值类型。仅仅能取以下两种
- cv2.THRESH_BINARY
- cv2.THRESH_BINARY_INV
- 11 是blocksize。奇数
- 2 常数C。用于从平均值或带权重的平均值中减去这个值
返回值
- adaptive 返回二值化后的图片
模糊和平滑(Blur & Smoothing)
中文官方解释见这里:【图像平滑】
在图片的自适应局部二值化之前,一般先要进行图片的平滑处理,以过滤掉那些 噪点 。原理是让待处理图片和一个低通滤波器的 核(low-pass filter kernel)。事实上就是一个矩阵,做卷积运算。
所谓滤波。就是过滤掉信号中,高频或者低频,或者中间(即带通滤波)的部分。而低通的效果是 模糊,高通的效果是 锐化。
CSDN博主【浅墨】的这篇文章讲的非常好,事实上。整个将OpenCV的系列都非常深入浅出,适合刚開始学习的人。他也出了本书。有空能够关注一下。
举个栗子
img = cv2.imread('./lena.jpg')
# 方框滤波
boxBlur = cv2.boxblur(img, -1, (5, 5))
# 均值滤波
blur = cv2.blur(img, (5, 5))
# 高斯滤波,(5,5)是Kernel的大小
gBlur = cv2.GaussianBlur(img, (5, 5), 0)
# 中值滤波
mBlur = cv2.medianBlur(img, 5)
# 双边滤波
bBlur = cv2.bilateralFilter(img, 9, 75, 75)
前面的方框滤波,均值滤波,高斯滤波,都是属于 线性滤波, 而中值滤波和双边滤波都是非线性的。非线性的滤波。效果一般好一点,可是也相对会速度较慢。
对了,均值滤波事实上就是归一化的方框滤波,即
blur = cv2.boxblur(img, -1, (5, 5), True)
blur2 = blur(img, (5, 5))
两行代码事实上是一样的。
滑动条
一般我们用一些OpenCV中的函数,常常要动态地调一个參数。有了滑动条就会方便非常多,直接拖动就改变对应的參数,就像手机上放大音量那样简单。
比起前面。滑动条的响应函数要自定义。
def refresh(x):
print x
cv2.createTrackbar("value: ", "window title", 0, 255, refresh)
參数
- “value: ” 滑动条上的显示字符串
- “window title”,要显示在的窗体名
- 0 默认值
- 255 最大值
- 响应函数名
注意:
1. 这里的refresh函数中。变量x是必须的,否则取不了值
2. 创建滑动条。要在创建窗体代码的后面
样例和完整代码
综合上面讲的函数,我们写一个完整的样例,依次展示:原图,灰度图,高斯平滑,二值化,自适应高斯二值化五张图片。
import cv2
title_ori = "binary"
title_ada = "adaptive"
title_trackbar = "threshold value"
# when value changed, refresh the picture
def refresh(x):
ret, thres = cv2.threshold(blur, x, 255, cv2.THRESH_BINARY)
cv2.imshow(title_ori, thres)
img = cv2.imread("./lena.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# create window
cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.namedWindow("gray", cv2.WINDOW_NORMAL)
cv2.namedWindow("blur", cv2.WINDOW_NORMAL)
# show origin image, gray image and blur image
cv2.imshow("img", img)
cv2.imshow("gray", gray)
cv2.imshow("blur", blur)
# create window and trackbar for binary image
cv2.namedWindow(title_ori, cv2.WINDOW_NORMAL)
cv2.createTrackbar(title_trackbar, title_ori, 0, 255, refresh)
cv2.imshow(title_ori, img)
# create and show adaptive threshold
adaptive = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.namedWindow(title_ada, cv2.WINDOW_NORMAL)
cv2.imshow(title_ada, adaptive)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV入门笔记(三) 图片处理的更多相关文章
- OpenCV入门笔记(七) 文字区域的提取
https://blog.csdn.net/huobanjishijian/article/details/63685503 前面我们已经学了一些OpenCV中基本的图片处理的知识,可以拿来做一些小应 ...
- OpenGLES入门笔记三
在入门笔记一中比较详细的介绍了顶点着色器和片面着色器. 在入门笔记二中讲解了简单的创建OpenGL场景流程的实现,但是如果在场景中渲染任何一种几何图形,还是需要入门笔记一中的知识:Vertex Sha ...
- OpenCV入门笔记(二) 图片的文件操作
以下介绍一下重要的几个,设计基本 图片处理 的函数,依次来了解OpenCV的入门知识.具体的具体使用方法还是以官方的API[Official Tutorials][Python-OpenCV]为准. ...
- opencv入门笔记
一.图片基本操作 1.1 显示图片 #include <opencv2/opencv.hpp> //头文件 using namespace cv; //包含cv命名空间 void main ...
- OpenCV入门笔记(一) Linux下的安装
关于OpenCV,有中文的官方站点.里面翻译了官网的教程和API等.中文官方Tutorials见这里:[Tutorials] 一.Ubuntu下的安装 能够选择直接从库里安装,或者手动编译安装,请參考 ...
- 【opencv学习笔记三】opencv3.4.0数据类型解释
opencv提供了多种基本数据类型,我们这里分析集中常见的类型.opencv的数据类型定义可以在D:\Program Files\opencv340\opencv\build\include\open ...
- Opencv 入门学习之图片人脸识别
读入图片,算法检测,画出矩形框 import cv2 from PIL import Image,ImageDraw import os def detectFaces(image_name): im ...
- opencv入门教程三
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨) ...
- Shader 入门笔记(三) ShaderLab 初识
Unity中,Unity Shader 都是ShaderLab 来编写的.ShaderLab 是Unity提供的编写Unity Shader 的一种说明性语言. 1)Properties :定义了着色 ...
随机推荐
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- 限制MYSQL从服务器为只读状态
修改全局变量的方法有两种,第一种是修改配置文件,第二种是SQL语句设置全局变量的值.(可以参考:http://www.cnblogs.com/qlqwjy/p/8046592.html) 0.简介: ...
- CGRectInset、CGRectOffset、等对比整理
http://blog.sina.com.cn/s/blog_76f3236b01013zmk.html 分类: iphone有关 1.CGRectInsetCGRect CGRectInset ...
- 【leetcode】500. Keyboard Row
问题描述: Given a List of words, return the words that can be typed using letters of alphabet on only on ...
- springBoot【01】
/* 使用spring官网的 http://start.spring.io/ 来建立项目包 生成入口文件,入口文件中对类注释@SpringBootApplication,这个注释是唯一的,标明这个类是 ...
- appium+python自动化26-模拟手势点击坐标(tap)【转载】
# 前言:有时候定位元素的时候,你使出了十八班武艺还是定位不到,怎么办呢?(面试经常会问)那就拿出绝招:点元素所在位置的坐标 tap用法 1.tap是模拟手指点击,一般页面上元素的语法有两个参数,第 ...
- 分层图【p2939】[USACO09FEB]改造路Revamping Trails
Description 约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小 ...
- Spfa【p1186】 玛丽卡
Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个 ...
- Flash3D学习计划(二)——理解世界,取景,投影变换,并理解投影坐标系
各种坐标系都是有用的,因为某些信息只能在特定场景中才有意义. 一. 世界坐标系 世界坐标系是一个特殊的坐标系,它建立了描述其他坐标系所需要的参考框架.这就意味着,能够用世界坐标系描述其他坐标系的位置, ...
- Android-onInterceptTouchEvent()和onTouchEvent()
老实说,这两个小东东实在是太麻烦了,很不好懂,我自己那api文档都头晕,在网上找到很多资料,才知道是怎么回事,这里总结一下,记住这个原则就会很清楚了: 1.onInterceptTouchEvent( ...