OpenCV入门笔记(三) 图片处理
来源:互联网 发布:双代号网络计划图 编辑:程序博客网 时间:2024/05/16 17:05
OpenCV中提供了很多处理图片的强大函数,可以对很多格式的图片 加特效!有点实现Photoshop里的工具的感觉。 下面先介绍一些简单和常见的特效。
二值化(Image Threshold)
参考这里:Image Processing
二值化只能处理灰度图,而所谓的灰度图,就是一幅只用 0-255 这个范围来表示每一个像素点的图像。灰度图没有色彩信息,看起来灰萌灰萌哒;但是又不完全只有黑白两种颜色。
二值化,顾名思义,就是把灰度图的0-255的范围,映射到 0 和 1 两个值上。最简单的做法,便是先设置一个阈值(threshold),比如叫 t 好了。当灰度图完成了的像素值 g < t,则赋值为 1,否则为 0. 这样就完成了二值化。
二值化的效果,是能够将物体和背景分割出来,原理是让物体和背景的像素间方差最大。
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 xcv2.createTrackbar("value: ", "window title", 0, 255, refresh)
参数
- “value: ” 滑动条上的显示字符串
- “window title”,要显示在的窗口名
- 0 默认值
- 255 最大值
- 响应函数名
注意:
1. 这里的refresh函数中,变量x是必须的,否则取不了值
2. 创建滑动条,要在创建窗口代码的后面
例子和完整代码
综合上面讲的函数,我们写一个完整的例子,依次展示:原图,灰度图,高斯平滑,二值化,自适应高斯二值化五张图片。
import cv2title_ori = "binary"title_ada = "adaptive"title_trackbar = "threshold value"# when value changed, refresh the picturedef 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 windowcv2.namedWindow("img", cv2.WINDOW_NORMAL)cv2.namedWindow("gray", cv2.WINDOW_NORMAL)cv2.namedWindow("blur", cv2.WINDOW_NORMAL)# show origin image, gray image and blur imagecv2.imshow("img", img)cv2.imshow("gray", gray)cv2.imshow("blur", blur)# create window and trackbar for binary imagecv2.namedWindow(title_ori, cv2.WINDOW_NORMAL)cv2.createTrackbar(title_trackbar, title_ori, 0, 255, refresh)cv2.imshow(title_ori, img)# create and show adaptive thresholdadaptive = 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 入门:用 Node.js 进行图片处理 (译文)
- OpenCV入门笔记(二) 图片的文件操作
- OpenCV学习笔记__入门篇(三)
- openCV学习笔记(三)--图像处理Image Processing
- OpenCV笔记(三)
- opencv存入数据库图片入门笔记
- OpenCV学习笔记10 OpenCV图像处理模块ImgProc Module. Image Processing(三)
- OpenCV入门笔记(二)
- OpenCV 学习笔记(三)
- opencv学习笔记(三)
- opencv学习笔记(三)
- OpenCV学习笔记(三)
- 【OpenCV】opencv处理透明图片
- python opencv入门(学习笔记no.1)-图片的读入读出
- 学习OpenCV的学习笔记系列(三)显示图片及视频
- python opencv 入门 加载图片(1)
- OpenCV学习笔记之 ( 三 ) MFC显示Mat图片
- 谈使用Eclipse与DDMS调试Android程序的方法
- UILabel文字滚动
- Android build系统,读后对之前的一些工作有了进一步的体会
- MFC学习笔记.day02续-CDC类,绘图区域,CPen画笔,画刷 CBrush,DC设备描述表
- android开发动画总结二(frame animation)
- OpenCV入门笔记(三) 图片处理
- pandas 数据归一化以及行删除例程
- 一个centos7上全自动互动式编译nginx的脚本
- Python脚本生成sitemap
- 那些个正在实施hybris的公司们
- DiskLruCache硬盘缓存技术详解
- robotium 代码分析
- LeetCode -- 反转英文单词
- java代码实现输出指定以.java结尾的文件的绝对路径