图像二值化 opencv c++ matlab 实现

本文介绍了如何使用C++的OpenCV库和MATLAB进行图像二值化处理,包括基于固定阈值的二值化和局部动态二值化。在C++中,通过遍历像素并比较阈值来实现;在MATLAB中,同样利用循环结构完成二值化转换。局部动态二值化则考虑了像素邻域的平均灰度,增加了处理的鲁棒性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图像二值化

图像二值化

代码实现
c++
cv::Mat binary(const cv::Mat& inputImage, int threshold)
{
	cv::Mat binary=inputImage.clone();
	int width = binary.cols;
	int height = binary.rows;

	// 遍历图像像素
	for (int i = 0; i < height; i++)
	{
		for (int j = 0; j < width; j++)
		{
			// 对每个像素进行二值化
			if (binary.at<uchar>(i, j) > threshold)
				binary.at<uchar>(i, j) = 255; // 设置为白色
			else
				binary.at<uchar>(i, j) = 0; // 设置为黑色
		}
	}

	return binary;
}
matlab
function I2 = binarize(I_scrimage,th)%二值化
[rows, cols, channels] = size(I_scrimage);
I2 = zeros(rows, cols, channels);
for i=1:rows
    for j=1:cols
        if I_scrimage(i,j)>th
            I2(i,j)=255;
        else
            I2(i,j)=0;
        end
    end
end

实验结果
c++

参数:阈值为128

int threshold = 128; // 二值化阈值,取值范围为0-255
   Mat binaryImage = binary(img, threshold);
	cv::imshow("二值化图像", binaryImage);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sUrmAEi1-1689072829111)(C:\Users\张翔宇\AppData\Roaming\Typora\typora-user-images\image-20230711173122490.png)]

matlab

输入参数

%二值化
th=128;
b_image=binarize(I_scrimage,th);
subplot(333);imshow(uint8(b_image));title('二值化');
axis on;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VoKXZb2B-1689072829112)(C:\Users\张翔宇\AppData\Roaming\Typora\typora-user-images\image-20230709164723037.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ux6M55hu-1689072829113)(C:\Users\张翔宇\AppData\Roaming\Typora\typora-user-images\image-20230709164708474.png)]

图像局部二值化

代码实现
c++
// 局部动态二值化函数
cv::Mat localDynamicThreshold(const cv::Mat& inputImage, int Sx, int Sy, int TH1)
{
	cv::Mat grayImage=inputImage.clone();

	int width = grayImage.cols;
	int height = grayImage.rows;

	cv::Mat binaryImage(grayImage.size(), CV_8UC1); // 创建与灰度图像相同大小的二值化图像

	// 遍历图像像素
	for (int i = Sy; i < height - Sy; i++)
	{
		for (int j = Sx; j < width - Sx; j++)
		{
			// 计算窗口内像素的平均灰度
			int sum = 0;
			for (int m = -Sy; m <= Sy; m++)
			{
				for (int n = -Sx; n <= Sx; n++)
				{
					sum += grayImage.at<uchar>(i + m, j + n);
				}
			}
			int fmean = sum / ((2 * Sx + 1) * (2 * Sy + 1));

			// 根据阈值偏移进行二值化
			if (grayImage.at<uchar>(i, j) > fmean + TH1)
				binaryImage.at<uchar>(i, j) = 255; // 设置为白色
			else
				binaryImage.at<uchar>(i, j) = 0; // 设置为黑色
		}
	}

	return binaryImage;
}
matlab
function  I3 = local_binary(image,SX,SY,TH1)
[rows, cols] = size(image);

% 创建一个空矩阵,用于存储平滑后的图像
I3 = zeros(rows, cols);

% 遍历图像中的每个像素
for y = 1:rows
    for x = 1:cols
        % 计算窗口的边界
        x_min = max(1, x - SX);
        x_max = min(cols, x + SX);
        y_min = max(1, y - SY);
        y_max = min(rows, y + SY);
        
        % 获取窗口内的像素值
        window = image(y_min:y_max, x_min:x_max);
        
        % 计算平均值
        fmean = mean(window(:));
        pixel=image(y,x);
        if pixel>fmean+TH1
        % 将平均值存储在平滑后的图像中
           I3(y, x) = 255;
        else
            I3(y,x) = 0;
        end
    end
end

实验结果

c++

输入参数

int Sx = 3; // 窗口大小参数Sx
	int Sy = 3; // 窗口大小参数Sy
	int TH1 = 20; // 阈值偏移参数TH1
	cv::Mat localbinaryImage = localDynamicThreshold(img, Sx, Sy, TH1);
	cv::imshow("局部动态二值化图像", localbinaryImage);

在这里插入图片描述

matlab

输入参数

%实现局部动态二值化函数
SX=2;
SY=2;
TH1=30;
I3 = local_binary(I_scrimage,SX,SY,TH1);
subplot(335);imshow(uint8(I3));title('局部动态二值化');
axis on;

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值