图像二值化
图像二值化
代码实现
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);
matlab
输入参数
%二值化
th=128;
b_image=binarize(I_scrimage,th);
subplot(333);imshow(uint8(b_image));title('二值化');
axis on;
图像局部二值化
代码实现
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;