图像处理知识点6:基于直方图三角法的阈值分割(C++)

文章介绍了使用C++编写的三角几何化算法,通过计算直方图峰值及其两侧的直线,确定图像分割的阈值,将像素分为黑白两部分。

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

        算法描述:三角几何化的过程。首先找到直方图中灰度值频率最高的一点并判别该灰度级处于128(256个灰度级的一半)的左侧还是右侧,然后找到最左边点或最右边点,两点连接一条直线,求直方图上离直线最远的点,设置该点的灰度值为阈值。

        算法特点:多适用于C++代码

void Triangle1(unsigned char* inputImg, unsigned char* outputImg, int width, int height)
//{
//	int histogram[256] = { 0 };
//	
//	for (int i = 0; i < height; i++)
//	{
//		for (int j = 0; j < width; j++)
//		{
//			histogram[(int)inputImg[i * width + j]] ++;
//		}
//	}
//
//	/*for (int i = 0; i < height; i++)
//	{
//		for (int j = 0; j < width; j++)
//		{
//			cout<<
//		}
//	}*/
//
//
//
//	histogram[0] = 0;
//	histogram[1] = 0;
//	//histogram[2] = 0;
//	//histogram[3] = 0;
//	histogram[255] = 0;
//
//	/**找到直方图的纵坐标与横坐标标**/
//	float max = 0;
//	int maxidx = 0;
//	for (int i = 0; i < 256; ++i)
//	{
//		if (histogram[i] > max)
//		{
//			max = histogram[i];    //纵坐标
//			maxidx = i;            //横坐标
//		}
//	}
//
//	bool lr = maxidx < 127;      //布尔类型,判断波峰处于直方图左边还是右边
//
//	float maxd = 0;
//	int maxdidx = 0;
//	if (lr)
//	{
//		float A = float(-max);                                 // A=(y2-y1)
//		float B = float(maxidx - 255);                         // B=(x1-x2)
//		float C = float(max * 255);                           //c=(x2*y1-x1*y2)   默认是的点是(255,0)
//
//		for (int i = maxidx + 1; i < 256; ++i)
//		{
//			float x0 = float(i);
//			float y0 = histogram[i];
//			float d = abs(A * x0 + B * y0 + C) / std::sqrt(A * A + B * B);         //点到直线距离公式
//			if (d > maxd)
//			{
//				maxd = d;	
//				maxdidx = i;
//			}
//		}
//	}
//
//	else 
//	{
//		float A = float(-max);
//		float B = float(maxidx);
//		float C = 0.0f;
//		
//		for (int i = 0; i < maxidx; ++i)
//		{
//			float x0 = float(i);
//			float y0 = histogram[i];
//			float d = abs(A * x0 + B * y0 + C) / std::sqrt(A * A + B * B);    //点到直线距离公式
//			if (d > maxd)
//			{
//				maxd = d;
//				maxdidx = i;
//			}
//		}
//	}
//
//	cout << "分割阈值" << maxdidx << endl;
//
//	for (int i = 0; i < height; i++)
//	{
//		for (int j = 0; j < width; j++)
//		{
//			if (inputImg[i * width + j] > maxdidx)
//			{
//				outputImg[i * width + j] = 0;
//			}
//			if (inputImg[i * width + j] < maxdidx)
//			{
//				outputImg[i * width + j] = 255;
//			}
//		}
//	}
//}

大致示意图如下所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值