图像算法(二):直方图均衡化和直方图规定化(匹配)

更新时间:2023-07-20 19:13:04 阅读: 评论:0

图像算法(⼆):直⽅图均衡化和直⽅图规定化(匹配)
最近在复习图像算法,对于⼀些简单的图像算法进⾏⼀个代码实现,由于找⼯作⽐较忙,具体原理后期补上,先上代码。今天先给出直⽅图均衡化和直⽅图规定化(匹配)。
1.直⽅图均衡化
针对整个图像偏较暗⾊调,对图像进⾏全局拉伸,增强图像质量。
(1)步骤:
(a)计算每个像素值的频数Hist
(b)计算每个像素值的频率(直⽅图)HistP = Hist/像素个数N
(c)计算累计直⽅图HistPSum
(d)求直⽅图均衡化之后的像素值255*HistPSum
(2)代码
# include<iostream>
# include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
Mat HistEq(Mat &srcImage);
Mat rgbTOgray(Mat srcImg);
int main()
{
Mat srcImg = imread("D:\\Visual Studio 2015\\Girl.bmp");
Mat resultImg;
if (!srcImg.data)
{
cout << "图⽚不存在" << endl;
}
if (srcImg.channels() == 3)
小肚子凉{
Mat gray = rgbTOgray(srcImg);
resultImg = HistEq(gray);
imshow("gray", gray);
imshow("result", resultImg);
}
if (srcImg.channels() == 1)
{
resultImg = HistEq(srcImg);
imshow("gray", srcImg);
imshow("result", resultImg);
}
waitKey(0);
return 0;
}
//彩⾊转灰度
Mat rgbTOgray(Mat srcImg)
{
int rows = ws;
int cols = ls;
Mat gray(rows, cols, CV_8UC1);
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
gray.at<uchar>(i, j) = (int)(0.114*srcImg.at<Vec3b>(i, j)[0] + 0.587*srcImg.at<Vec3b>(i, j)[1] + 0.299*srcImg.at<Vec3b>(i, j)[2]);
}
}
return gray;
}
//直⽅图均衡化
//直⽅图均衡化
出庭委托书Mat HistEq(Mat &srcImage)
{
int rows = ws;
int cols = ls;
Mat resultImage(rows, cols, pe());
int Hist[256];
double HistP[256];
double HistPSum[256];
int EqHist[256];
int i, j;
for (i = 0; i < 256; i++)
{
Hist[i] = 0;
HistP[i] = 0.0;
HistPSum[i] = 0.0;
EqHist[i] = 0;
}
//求每个像素的频数
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
Hist[(int)srcImage.at<uchar>(i, j)]++;
}
}
//每个像素的概率
for (i = 0; i < 256; i++)
{
HistP[i] = (double)Hist[i] / (rows*cols);
}
/
/每个像素的累计概率
HistPSum[0] = HistP[0];
for (i = 1; i < 256; i++)
{
HistPSum[i] = HistP[i] + HistPSum[i - 1];
}
//直⽅图均衡化之后的值
for (i = 0; i < 256; i++)
{
EqHist[i] = cvRound((double)HistPSum[i] * 255);
}
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
resultImage.at<uchar>(i, j) = EqHist[(int)srcImage.at<uchar>(i, j)];  }
}
return resultImage;
}
(3)结果
2.直⽅图规定化(匹配)
直⽅图均衡化针对全局进⾏拉伸,不能满⾜特定某⼀段直⽅图修正的作⽤,于是使⽤直⽅图规定化。(1)步骤:
(a)计算原始图像和⽬标图像的每个像素值的频数Hist
(b)计算原始图像和⽬标图像的每个像素值的频率(直⽅图)HistP = Hist/像素个数N走过那个拐角
(c)计算原始图像和⽬标图像的累计直⽅图HistPSum
(d)计算原始图像和⽬标图像的累计直⽅图的差的最⼩值作作为映射规则
(2)代码
# include<iostream>
# include<opencv2/highgui/highgui.hpp>
# include<cmath>
using namespace cv;
using namespace std;
Mat HistMatch(Mat &srcImage, Mat &targetImage);
参加运动会的英文Mat rgbTOgray(Mat srcImg);
int main()
{
Mat srcImg = imread("D:\\Visual Studio 2015\\lena.bmp");
Mat targetImg = imread("D:\\Visual Studio 2015\\Girl.bmp");
Mat resultImg;
if (!srcImg.data || !targetImg.data)
{
cout << "图⽚不存在" << endl;
}
Mat gray1 = rgbTOgray(srcImg);
Mat gray2 = rgbTOgray(targetImg);
resultImg = HistMatch(gray1, gray2);
imshow("gray1", gray1);
imshow("gray2", gray2);
imshow("result", resultImg);
玫瑰花童话waitKey(0);
return 0;
}
//彩⾊转灰度
Mat rgbTOgray(Mat srcImg)
{
int rows = ws;
int cols = ls;
Mat gray(rows, cols, CV_8UC1);
Mat gray(rows, cols, CV_8UC1);
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
gray.at<uchar>(i, j) = (int)(0.114*srcImg.at<Vec3b>(i, j)[0] + 0.587*srcImg.at<Vec3b>(i, j)[1] + 0.299*srcImg.at<Vec3b>(i, j)[2]);  }
}
return gray;
}
//直⽅图规定化
Mat HistMatch(Mat &srcImage, Mat &targetImage)
{
int rows = ws;
int cols = ls;
int rows_t = ws;
int cols_t = ls;
Mat resultImage(rows, cols, pe());
int Hist[256];
double HistP[256];
double HistPSum[256];
int Hist_t[256];
double HistP_t[256];
double HistPSum_t[256];
int HistMatch[256];
int i, j;
for (i = 0; i < 256; i++)
{
Hist[i] = 0;
HistP[i] = 0.0;
HistPSum[i] = 0.0;
Hist_t[i] = 0;
HistP_t[i] = 0.0;
HistPSum_t[i] = 0.0;
HistMatch[i] = 0;
}
//求每个像素的频数
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
怎么提高英语水平{
Hist[(int)srcImage.at<uchar>(i, j)]++;
}
}
for (i = 0; i < rows_t; i++)
{
for (j = 0; j < cols_t; j++)
{
Hist_t[(int)targetImage.at<uchar>(i, j)]++;
}
}
//每个像素的概率
for (i = 0; i < 256; i++)
{
HistP[i] = (double)Hist[i] / (rows*cols);
HistP_t[i] = (double)Hist_t[i] / (rows_t*cols_t);
}
//每个像素的累计概率
HistPSum[0] = HistP[0];
HistPSum_t[0] = HistP_t[0];
for (i = 1; i < 256; i++)
for (i = 1; i < 256; i++)
{
HistPSum[i] = HistP[i] + HistPSum[i - 1];
HistPSum_t[i] = HistP_t[i] + HistPSum_t[i - 1];
}
//求匹配度
for (i = 0; i < 256; i++)
{
double min = 255.0;
int flag = 0;
for (j = 0; j < 256; j++)旧村改造
{
if (min > abs(HistPSum[i] - HistPSum_t[j]))
{
min = abs(HistPSum[i] - HistPSum_t[j]);
一分米等于几厘米flag = j;
}
}
HistMatch[i] = flag;
}
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
resultImage.at<uchar>(i, j) = HistMatch[(int)srcImage.at<uchar>(i, j)];  }
}
return resultImage;
}

本文发布于:2023-07-20 19:13:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1107449.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   像素   计算   拉伸   均衡化   全局
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图