openCV中二值化图像的方法



图像的二值化就是将图像上的像素点的灰度值设置为0255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。

   下面我们来介绍两种二值化的方法

   1.threshold

首先,我们先来学习一个新函数——threshold(中文翻译为临界值,实际上也就是阈值函数

函数原型double threshold( InputArray src,OutputArray dst,double threshold,double maxval,intype );

参数说明

src:原始数组,可以是Mat类型

dst:输出数组,必须与 src 的类型一致。

threshold:阈值

maxval:使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。

type:阈值类型

type=CV_THRESH_BINARY:如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,dst(x,y)=0;

type=CV_THRESH_BINARY_INV:如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value.

type=CV_THRESH_TRUNC:如果 src(x,y)>threshold,dst(x,y) = max_value; 否则dst(x,y) = src(x,y).

type=CV_THRESH_TOZERO:如果src(x,y)>threshold,dst(x,y) = src(x,y) ; 否则 dst(x,y) = 0。

type=CV_THRESH_TOZERO_INV:如果 src(x,y)>threshold,dst(x,y) = 0 ; 否则dst(x,y) = src(x,y).

 

代码实例

#include"stdafx.h"

#include "opencv2/imgproc/imgproc.hpp"  

#include "opencv2/highgui/highgui.hpp"  

#include    

using namespace cv;

using namespace std;

void main()

{

//定义变量

Mat img;

Mat result;

//载入图片  

img = imread("E:\\6.jpg",0);

// 转为二值图  

threshold(img, result, 170, 255, CV_THRESH_BINARY);

//显示原图  

namedWindow("Image");

imshow("Image", img);

// 显示二值图 

namedWindow("二值化后的图像1");

imshow("二值化后的图像1",result);

waitKey(0);

}

结果截图

Opencv学习笔记(九)图像的二值化以及轮廓检测

Opencv学习笔记(九)图像的二值化以及轮廓检测
 

下面我们来介绍第二种方法

 

2.第二种方法我们没有用特定的函数,而是用一个简单的语句实现

threshval < 100 ? (img < 160) : (img > 160)

这个语句的意思是,如果阈值小于100,那么中间为真,即像素值小于160的为1,大于160的为0;如果阈值大于100,那么右边为真,即像素值大于160的为1,小于160的为0.

 

代码实例

 

#include"stdafx.h"

#include "opencv2/imgproc/imgproc.hpp"  

#include "opencv2/highgui/highgui.hpp"  

#include    

using namespace cv;

using namespace std;

 

void main()

{

//定义变量

Mat img;

int threshval =170;//设定阈值

Mat result;

    Mat bw = img;

//载入图片  

img = imread("E:\\6.jpg",0);

//显示原图  

namedWindow("Image");

imshow("Image", img);

    bw = threshval < 100 ? (img < 160) : (img > 160);//二值化

    namedWindow("二值化后的图像2");

imshow("二值化后的图像2", bw);

waitKey(0);

}

 

结果截图

Opencv学习笔记(九)图像的二值化以及轮廓检测

Opencv学习笔记(九)图像的二值化以及轮廓检测

 

3.其实我们还可以用一种最原始的方法,写一个for循环遍历Mat内的像素值,大于该值的统一为255,小于该值的统一为0,此处不予实现。

 

### OpenCVSharp中的二处理 在OpenCVSharp中,图像的二处理是一种常见的操作,用于将灰度图像转换为只有两个可能像素(通常是黑色和白色)的形式。这种技术广泛应用于计算机视觉领域,特别是在目标检测、边缘提取以及形态学分析等方面。 #### 阈处理函数 `Cv2.Threshold` `Cv2.Threshold` 是 OpenCVSharp 中实现二的关键方法之一。该方法允许开发者指定一个阈来决定哪些像素被设置为前景(通常为白色),哪些像素被设置为背景(通常为黑色)。以下是其基本语法: ```csharp double Cv2.Threshold( InputArray src, OutputArray dst, double thresh, double maxval, ThresholdTypes type ); ``` - **src**: 输入图像,一般是一个单通道的灰度图。 - **dst**: 输出图像,具有与输入图像相同的尺寸和类型。 - **thresh**: 设定的阈。 - **maxval**: 当使用某些类型的阈时的最大。 - **type**: 阈处理的方式,具体选项包括但不限于以下几种: - `ThresholdTypes.Binary`: 如果像素大于设定的阈,则设为最大;否则设为零。 - `ThresholdTypes.BinaryInv`: 反向效果于 Binary 类型。 - `ThresholdTypes.Trunc`: 将像素截断到阈处。 - `ThresholdTypes.ToZero`: 对低于阈的部分置零,其余保持不变。 - `ThresholdTypes.ToZeroInv`: 对高于或等于阈的部分置零,其余保持不变。 下面是一段简单的代码示例展示如何应用此函数完成二过程[^1]: ```csharp using System; using OpenCvSharp; class Program { static void Main() { // 加载图片并转成灰度模式 string imagePath = "path_to_your_image.jpg"; Mat image = Cv2.ImRead(imagePath, ImreadModes.GrayScale); if (image.Empty()) { Console.WriteLine("无法读取图像"); return; } // 创建存储结果的空间 Mat binaryImage = new Mat(); // 使用固定阈进行二 Cv2.Threshold(image, binaryImage, 127, 255, ThresholdTypes.Binary); // 显示原图与二后的对比 Cv2.ImShow("原始图像", image); Cv2.ImShow("二图像", binaryImage); Cv2.WaitKey(0); } } ``` 上述程序首先加载了一张图片,并将其转为灰阶形式以便后续处理。接着调用了 `Cv2.Threshold` 函数执行实际的二工作,在这里选择了固定的阈127作为分界线。最后分别展示了原始图像及其对应的二版本。 #### 自适应阈处理 `Cv2.AdaptiveThreshold` 除了手动定义全局阈外,还可以利用自适应阈算法自动计算局部区域的最佳分割界限。这种方法特别适合光照不均匀或者复杂背景下仍需精确分离对象的情况。下面是关于它的描述及用法说明: ```csharp void Cv2.AdaptiveThreshold( InputArray src, OutputArray dst, double maxValue, AdaptiveThresholdTypes adaptiveMethod, ThresholdTypes thresholdType, int blockSize, double C ); ``` 参数解释如下: - **adaptiveMethod**: 定义了计算当前像素邻域平均亮度的方法,可选有 `AdaptiveThresholdTypes.MeanC`(均减去常数C) 和 `AdaptiveThresholdTypes.GaussianC`(高斯加权求和再减去常数C). - **blockSize**: 计算每个像素点附近区域大小的一个奇数. - **C**: 应用于整个公式的偏移量. 一段示范性的例子可以这样写: ```csharp Mat adaptiveBinaryImage = new Mat(); Cv2.AdaptiveThreshold(image, adaptiveBinaryImage, 255, AdaptiveThresholdTypes.GaussianC, ThresholdTypes.Binary, 11, 2); Cv2.ImShow("自适应二图像", adaptiveBinaryImage); ``` 这段脚本实现了基于Gaussian权重方案下的自适应二变换.
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值