OpenCV实现图像阈值化
2016-08-18 19:43
211 查看
纯粹阅读,请移步OpenCV实现图像阈值化
阈值化是一种将我们想要在图像中分析的区域分割出来的方法。
我们把每个像素值都与一个预设的阈值做比较,再根据比较的结果调整像素值。
类似这样
其中100是阈值,255是最大值(纯白色的值)。
自适应阈值用到的3个参数
自适应方法
Imgproc.ADAPTIVE_THRESH_MEAN_C:阈值是邻域像素的值
Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是领域像素的加权和,权重来自高斯核
块尺寸
邻域的大小
常量C
从对每个像素计算得到的均值或加权均值减去的常量
图像置灰
自适应阈值化
效果图
源码
KqwOpenCVBlurDemo阈值化是一种将我们想要在图像中分析的区域分割出来的方法。
我们把每个像素值都与一个预设的阈值做比较,再根据比较的结果调整像素值。
类似这样
Imgproc.threshold(src,src,100,255,Imgproc.THRESH_BINARY);
其中100是阈值,255是最大值(纯白色的值)。
常量
名称 | 常量 |
---|---|
二值阈值化 | Imgproc.THRESH_BINARY |
阈值化到零 | Imgproc.THRESH_TOZERO |
截断阈值化 | Imgproc.THRESH_TRUNC |
反转二值阈值化 | Imgproc.THRESH_BINARY_INV |
反转阈值化到零 | Imgproc.THRESH_TOZERO_INV |
自适应阈值
上述的阈值化是全局性的,我们也可以根据邻域像素为任意像素计算阈值。自适应阈值用到的3个参数
自适应方法
Imgproc.ADAPTIVE_THRESH_MEAN_C:阈值是邻域像素的值
Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是领域像素的加权和,权重来自高斯核
块尺寸
邻域的大小
常量C
从对每个像素计算得到的均值或加权均值减去的常量
图像置灰
Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2GRAY);
自适应阈值化
Imgproc.adaptiveThreshold(src, src, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 3, 0);
封装
这里我用到了RxJava。主要是因为图片处理是耗时操作,会阻塞线程,为了防止界面卡顿,这里使用RxJava进行了线程切换。/** * 自适应阈值 * * @param bitmap 要处理的图片 */ public void adaptiveThreshold(Bitmap bitmap) { // 使用RxJava处理图片 if (null != mSubscriber) Observable .just(bitmap) .map(new Func1<Bitmap, Bitmap>() { @Override public Bitmap call(Bitmap bitmap) { // Bitmap转为Mat Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC4); Utils.bitmapToMat(bitmap, src); // 图像置灰 Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2GRAY); // 自适应阈值化 Imgproc.adaptiveThreshold(src, src, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 3, 0); // 二值阈值化 // Imgproc.threshold(src,src,100,255,Imgproc.THRESH_BINARY); // 阈值化到零 // Imgproc.threshold(src,src,100,255,Imgproc.THRESH_TOZERO); // 截断阈值化 // Imgproc.threshold(src,src,100,255,Imgproc.THRESH_TRUNC); // 反转二值阈值化 // Imgproc.threshold(src,src,100,255,Imgproc.THRESH_BINARY_INV); // 反转阈值化到零 // Imgproc.threshold(src,src,100,255,Imgproc.THRESH_TOZERO_INV); // Mat转Bitmap Bitmap processedImage = Bitmap.createBitmap(src.cols(), src.rows(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(src, processedImage); return processedImage; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(mSubscriber); }
调用
// 图片处理的工具类 mBlurUtil = new BlurUtil(new Subscriber<Bitmap>() { @Override public void onCompleted() { // 图片处理完成 dismissProgressDialog(); } @Override public void onError(Throwable e) { // 图片处理异常 dismissProgressDialog(); } @Override public void onNext(Bitmap bitmap) { // 获取到处理后的图片 mIvImageProcessed.setImageBitmap(bitmap); } }); // 自适应阈值 mBlurUtil.adaptiveThreshold(mSelectImage);
相关文章推荐
- otsu结合OpenCV实现灰度图像自动阈值处理
- opencv实现图像的剪切和缩放
- Opencv2.1中的图像切分grabcut实现
- 利用OpenCV实现图像的阈值分割
- opencv 旋转图像函数实现 等同于matlab里的rotate() (注:旋转后图像变大,超出部分填为黑色)
- 基于guided image filtering的图像去雾 opencv实现
- 图像分割中阈值的自动选取的研究及其算法实现
- 使用OpenCV实现内存中图像数据的RGB-->HSV转换
- opencv实现图像邻域均值滤波、中值滤波、高斯滤波
- 曲线拟合的最小二乘法(基于OpenCV实现)的,拟合图像中离散点的拟合直线
- VS2010实现opencv基于DCT的图像压缩
- 使用opencv实现图像局部放大功能
- 【Ubuntu+OpenCV】ubuntu/linux环境下,运用opencv实现图像的读入、显示--学习笔记【1】
- OTSU算法提取图像阈值的C语言实现[转载】
- 实现OpenCV的视频图像处理
- OPENCV下针对IplImage实现图像增强处理
- 基于CUDA和OpenCV实现的图像GAMMA变换
- OTSU算法提取图像阈值的C语言实现
- 关于OpenCV中利用函数cvConvert实现图像数据类型转换(8U->16S)
- OpenCV学习笔记(16)双目测距与三维重建的OpenCV实现问题集锦(一)图像获取与单目定标