实现灰度图像和彩色图像的迭代阈值分割算法 C语言 opencv实现
时间: 2024-05-06 11:18:59 浏览: 146
me_阈值分割_图像分割_图像阈值分割_
以下是基于OpenCV的C语言实现的灰度图像和彩色图像的迭代阈值分割算法。
灰度图像的迭代阈值分割算法:
```c
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("test_gray.jpg", IMREAD_GRAYSCALE); // 读入灰度图像
int T = 128; // 阈值初始值
int delta = 1; // 阈值变化量
int n = img.rows * img.cols; // 像素总数
while (delta > 0) // 迭代直到阈值不再变化
{
int sum1 = 0, sum2 = 0;
int cnt1 = 0, cnt2 = 0;
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
if (img.at<uchar>(i, j) < T)
{
sum1 += img.at<uchar>(i, j);
cnt1++;
}
else
{
sum2 += img.at<uchar>(i, j);
cnt2++;
}
}
}
int T_new = (sum1 / cnt1 + sum2 / cnt2) / 2; // 计算新阈值
delta = abs(T_new - T); // 计算阈值变化量
T = T_new; // 更新阈值
}
Mat dst;
threshold(img, dst, T, 255, THRESH_BINARY); // 应用阈值
imshow("src", img);
imshow("dst", dst);
waitKey();
return 0;
}
```
彩色图像的迭代阈值分割算法:
```c
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("test_color.jpg"); // 读入彩色图像
int T = 128; // 阈值初始值
int delta = 1; // 阈值变化量
int n = img.rows * img.cols; // 像素总数
while (delta > 0) // 迭代直到阈值不再变化
{
int sum1_b = 0, sum2_b = 0;
int sum1_g = 0, sum2_g = 0;
int sum1_r = 0, sum2_r = 0;
int cnt1 = 0, cnt2 = 0;
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
Vec3b pixel = img.at<Vec3b>(i, j);
int b = pixel[0], g = pixel[1], r = pixel[2];
int gray = (r + g + b) / 3;
if (gray < T)
{
sum1_b += b;
sum1_g += g;
sum1_r += r;
cnt1++;
}
else
{
sum2_b += b;
sum2_g += g;
sum2_r += r;
cnt2++;
}
}
}
int T_new = (sum1_b / cnt1 + sum1_g / cnt1 + sum1_r / cnt1 +
sum2_b / cnt2 + sum2_g / cnt2 + sum2_r / cnt2) / 6; // 计算新阈值
delta = abs(T_new - T); // 计算阈值变化量
T = T_new; // 更新阈值
}
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
Mat dst;
threshold(gray, dst, T, 255, THRESH_BINARY); // 应用阈值
imshow("src", img);
imshow("dst", dst);
waitKey();
return 0;
}
```
注意:彩色图像需要先转换为灰度图像再进行阈值分割。
阅读全文