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 一种灰度图像增强方式的主要内容,如果未能解决你的问题,请参考以下文章
python使用openCV图像加载(转化为灰度图像)使用equalizeHist算法增强灰度图像对比度可视化对比度增强之后的图像