opencv 一种灰度图像增强方式

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 一种灰度图像增强方式相关的知识,希望对你有一定的参考价值。

opencv 取灰度图颜色范围

opencv有自己的图像增强函数,这里提出一种定义范围颜色的增强方式,
下面是opencv自带直方图增强的函数,equalizeHist,如果需要三通道增强,可以分别取BGR三者做增强后合并

cv::Mat t1;
equalizeHist(g_gray, t1);
imshow("直方图均衡化", t1);

自行写函数进行像素操作,使用的时mat的at 函数,因为是灰度图像,所以可以使用src.at(x,y) 这种方式来取得或者赋值某个像素的值,如下所示,当数值溢出的时候,需要赋值最大或者最小值:

float p[256], p1[256], num[256];
int Histogram(cv::Mat &src, cv::Mat &dst)

	memset(p, 0, sizeof(p));
	memset(p1, 0, sizeof(p1));
	memset(num, 0, sizeof(num));

	int width = src.cols;
	int height = src.rows;
	float len = (float)(height * width);

	//求存放图象各个灰度级出现的次数

	for (int x = 0; x < src.rows; x++)
	
		for (int y = 0; y < src.cols; y++)
		
			uchar v = src.at<uchar>(x, y);
			num[v]++;
		
	

	//图像各个灰度级的出现概率
	for (int i = 0; i < 256; i++)
	
		p[i] = num[i] / len;
	

	//各个灰度级之前的概率和
	for (int i = 0; i < 256; i++)
	
		for (int k = 0; k <= i; k++)
			p1[i] += p[k];
	

	//直方图变换
	for (int x = 0; x < src.rows; x++)
	
		for (int y = 0; y < src.cols; y++)
		
			uchar v = src.at<uchar>(x, y);
			if (v > 220)
			
				//int v1 = p1[v] * 255- 5.5;
				int v1 = v - 15.5;
				/*if (v1 > 255)
					v1 = 255;*/
				dst.at<uchar>(x, y) = v1;
			
			else if (v < 70/* 50*/)
			
				int v1 = v - 30.5;// p1[v] * 255 - 15.5;
				if (v1 < 0)
					v1 = 0;
				dst.at<uchar>(x, y) = v1;// v1;
			
			else
			
				int v1 = p1[v] * 255 - 20.5;
				if (v1 < 0)
					v1 = 0;
				dst.at<uchar>(x, y) = v1;
			
		
	
	return 0;

左图是原图,中间的图是自行写的函数增强效果,可以看出效果比较明显。和自带函数相比,可以控制任意强度和任意范围做增强

以比较而言,自行写函数可以自已控制各类方式,效果是非常明显的,读者可以试着修改函数里面的参数,或者传参数进去,例如让黑的一款完全成黑色,这样在erode时图像处理更加轻松。还可以分段多种,保持某一种颜色,总之,比起已经存在的函数而言,最好的就是在于自己对图像处理的需求可以完全掌握。对于彩色图像,一样可以以这种方式做。

主函数main

int main()


	cv::Mat src = cv::imread("lines.jpg", 1);
	cv::Mat resrc;
	//缩小到一半大小
	cv::resize(src, resrc, src.size() / 2);
	cvtColor(resrc, g_gray, COLOR_BGR2GRAY);

	Mat imageEnhance;
	Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, 0, 5, 0, 0, -1, 0);
	filter2D(resrc, imageEnhance, CV_8UC3, kernel);
	imshow("拉普拉斯算子彩色", imageEnhance);


	//medianBlur(g_gray, g_gray, 3);

	cv::Mat t1;
	equalizeHist(g_gray, t1);

	imshow("直方图均衡化", t1);

	//cv::calcHist()
	g_dst.create(g_gray.size(), CV_8U);
	Histogram(g_gray, g_dst);
	cv::imshow("gray", g_gray);
	cv::imshow("dst", g_dst);


以上是关于opencv 一种灰度图像增强方式的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV C++(四)----对比度增强

OpenCV 完整例程51. 图像增强—直方图反向追踪

python使用openCV图像加载(转化为灰度图像)使用equalizeHist算法增强灰度图像对比度可视化对比度增强之后的图像

OpenCV图像增强---灰度变换直方图均衡化

OpenCV 完整例程50. 图像增强—直方图统计量图像增强

OpenCV 完整例程49. 图像增强—局部直方图处理