简单的二值图像生成

#include
#include 


using namespace cv;
using namespace std;

class color_detector
{
private:
	Vec3b color;//目标色
	int min_dist;//最小可接受距离
	Mat result;//结果
public:
	color_detector() :min_dist(0), color(0, 0, 0) {}//构造函数。

	void set_color(int b, int g, int r)
	{
		color[0] = b;
		color[1] = g;
		color[2] = r;

	}

	void set_color(Vec3b bgr)//函数的重载。
	{

		color = bgr;
	}

	void set_min_dist(int dist)
	{
		if (dist <= 0)
			min_dist = 0;
		else
			min_dist = dist;

	}

	int distance(Vec3b x)//计算距离函数。
	{
		return static_cast<int>(norm<int,3>(Vec3i(x[0]-color[0],x[1]-color[1],x[2]-color[2])));// 内部为三个int型的向量。

	}

	Mat process(Mat& image)//进行阈值处理的函数。
	{
		result.create(image.size(),CV_8U);

		//遍历图像,然后与目标色进行比较, 在目标色范围内的标记255,范围外的标记为0
		Mat_<Vec3b>::const_iterator it = image.begin<Vec3b>();
		Mat_<Vec3b>::const_iterator itend = image.end<Vec3b>();
		Mat_<uchar>::iterator output = result.begin<uchar>();
		for (; it != itend; ++it)
		{
			if (distance(*it) <= min_dist)
			{
				*(output++) = 255;
			}
			else
			{
				*(output++) = 0;

			}


		}

		return result;
	}

};



//给图片添加logo
int main()
{
	Mat image1 = imread("2.jpg");
	resize(image1, image1, Size(600,400));
	imshow("原图",image1);
	
	//开始进行处理。
	color_detector xx;
	xx.set_color(144,144,144);
	xx.set_min_dist(100);

	Mat result=xx.process(image1);
	imshow("result",result);


	waitKey(0);
	return 0;

}


简单的二值图像生成_第1张图片

你可能感兴趣的:(图像处理)