目录
一、什么是像素
像素是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子。
每个像素都是由颜色的组合组成的,更准确地说,就是原色。
绿色的RGB色值是(255,0,0)
绿色的RGB色值是(0,255,0)
绿色的RGB色值是(0,0,255)
对于一副8bit的图像来说,矩阵元素的取值范围是从0-255(0 - 2^8-1)
矩阵中的元素对应我们所说的像素(pixel),其值即该像素的灰度值,数值越大,像素的颜色越‘白/浅’;数值越小,像素的颜色越’黑/深‘
二、什么是通道
通道是彩色图像的灰度图像,它仅由构成彩色图像的一种原色组成。
通道只有在图像显示时才有意义!它是图像显示的容器!
一个RGB色彩空间的400*300的图片为例:这幅图的本质是一个400*300*3的一个矩阵
说明这个图像有400列,300行,以及在色彩上有三个分量,分别是:
RGB三通道分离图片R-G-B
2.1为什么它们是灰度的?
每个分量单独拿出来都是一个400*300(*1)的矩阵如你所见,它们并不是彩色的,而是一幅灰度图像;这是因为,当我们分割通道时,每个图像中的像素现在只有一个通道。所以它们是灰色的。
在图像显示时,我们把图像的R分量放进红色通道里,B分量放进蓝色通道里,G分量放进绿色通道里。经过一系列处理,显示在屏幕上的就是我们所看到的彩色图像了。
三、什么是直方图
直方图可以让你了解总体的图像像素强度分布,其X轴为像素值(一般范围为0~255),在Y轴上为图像中具有该像素值像素数。
直方图的作用: 通过直方图可以直观地图像的对比度、亮度、强度分布等。
四、直方图均衡化
直方图均衡化是一种简单有效的图像增强技术。
直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。
直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并,从而增大对比度,使图像清晰,达到增强的目的。
直方图均衡就是从图像的灰度图入手,通过调整图像的灰阶分布,使得在0~255灰阶上的分布更加均衡(拉伸像素强度分布范围),通过来增强图像对比度的一种方法.
直方图均值化图片:对比度明显改善
五、对比度
对比度: 是指一幅图像中灰度反差的大小
对比度 = 最大亮度 / 最小亮度
对比度低的特点:最亮度和最暗度相差不是很多
对比度低的特点:最亮度和最暗度相差很大,白的更白,黑的更黑
六、锐化滤波器
图像锐化的主要目的有两个:
1.增强图像边缘,使模糊的图像变得更加清晰,颜色变得鲜明突出,图像的质量有所改善,产生更适合人眼观察和识别的图像;
2.希望通过锐化处理后,目标物体的边缘鲜明,以便于提取目标的边缘、对图像进行分割、目标区域识别、区域形状提取等,进一步的图像理解与分析奠定基础。
注意:由于锐化使噪声受到比信号还要强的增强,所以要求锐化处理的图像有较高的信噪比;否则,锐化后的图像的信噪比更低。
图像锐化主要影响图像中的低频分量,不影响图像中的高频分量。
图像锐化一般有两种方法:
6.1 微分法 :梯度锐化和拉普拉斯锐化
6.1.1 一阶微分滤波器 梯度算子
邻域平均法或加权平均法可以平滑图像,反过来利用对应的微分算法可以锐化图像。微分算法是求信号的变化率,有加强高频分量胡作用,从而使图像轮廓清晰。
由于图像模糊胡实质是图像受到平均或积分运算造成的,所以为了把图像中任何方向伸展的边缘肯模糊的轮廓变得清晰,可以对图像进行逆运算如微分运算,从而使图像清晰化。
6.1.2 二阶微分-拉普拉斯算子锐化
计算公式:sharpened_pixel = 5 * current – left – right – up – down ;
参考: https://www.likecs.com/show-205085623.html
6.2 高通滤波法
七、伽马校正
Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系。
γ的值决定了输入图像和输出图像之间的灰度映射方式,即决定了是增强低灰度值区域还是增高灰度值区域。
γ>1时,图像的高灰度区域对比度得到增强,直观效果是一幅偏亮的图变暗了下来。
γ<1时,图像的低灰度区域对比度得到增强,直观效果是一幅偏暗的图变亮了起来。
γ=1时,不改变原图像。
参考: https://blog.csdn.net/wenhao_ir/article/details/51656802
代码:
-
#include <iostream>
-
#include <opencv2/core/core.hpp>
-
#include <opencv2/imgproc/imgproc.hpp>
-
#include <opencv2/highgui/highgui.hpp>
-
using
namespace cv;
-
-
const
int g_nMaxValueSlider =
100;
-
int g_fGammaValueSlider =
20;
-
Mat srcImage;
-
void on_Trackbar(int, void*);
//滑动条回调函数
-
-
int main()
-
{
-
//读取图片 0灰度图 1三通道彩色图像
-
srcImage =
imread(
"C:\\Users\\darren\\Desktop\\proj_test\\test\\test\\picture_test1\\1.jpg");
-
if (!srcImage.data) {
printf(
"读取srcImage错误!\n");
return
false; }
-
-
//------------------------直方图均衡化
-
//直方图均衡化是图像处理领域中利用 图像直方图 对 对比度 进行调整的方法
-
vector<Mat> channels;
-
Mat imageBlueChannel;
-
Mat imageGreenChannel;
-
Mat imageRedChannel;
-
Mat equalizeHistImage;
-
-
split(srcImage, channels);
//通道分离
-
imageBlueChannel = channels.
at(
0);
-
imageGreenChannel = channels.
at(
1);
-
imageRedChannel = channels.
at(
2);
-
-
namedWindow(
"raw picture");
//raw
-
imshow(
"raw picture", srcImage);
-
waitKey(
0);
-
-
namedWindow(
"r_channel");
//R
-
imshow(
"r_channel", imageRedChannel);
-
waitKey(
0);
-
-
namedWindow(
"g_channel");
//G
-
imshow(
"g_channel", imageGreenChannel);
-
waitKey(
0);
-
-
namedWindow(
"b_channel");
//B
-
imshow(
"b_channel", imageBlueChannel);
-
waitKey(
0);
-
-
-
//直方图均衡化只能对 灰度图进行均衡化,不能对彩色图片进行处理
-
equalizeHist(imageBlueChannel, imageBlueChannel);
//直方图均衡化
-
equalizeHist(imageGreenChannel, imageGreenChannel);
-
equalizeHist(imageRedChannel, imageRedChannel);
-
-
merge(channels, equalizeHistImage);
//融合
-
namedWindow(
"直方图均衡");
//创建窗口
-
imshow(
"直方图均衡",equalizeHistImage);
-
waitKey(
0);
-
-
//-----------------------锐化滤波器
-
//增强边缘与其他突变(如噪声、线),并削弱灰度变化缓慢的区域。
-
//二阶微分-拉普拉斯算子锐化
-
Mat kernel = (
Mat_<
float>(
3,
3) <<
0,
-1,
0,
-1,
5,
-1,
0,
-1,
0);
//核
-
Mat filter2DImage;
-
filter2D(srcImage, filter2DImage, srcImage.
depth(), kernel);
//通过卷积和对图形进行卷积运算
-
namedWindow(
"锐化滤波器");
-
imshow(
"锐化滤波器", filter2DImage);
-
waitKey(
0);
-
-
//
-
namedWindow(
"伽马矫正",
1);
-
char TrackbarName[
50];
-
sprintf_s(TrackbarName,
"fGamma %d", g_nMaxValueSlider);
-
createTrackbar(TrackbarName,
"伽马矫正", &g_fGammaValueSlider, g_nMaxValueSlider, on_Trackbar);
//滑动条
-
on_Trackbar(g_nMaxValueSlider,
0);
-
waitKey(
0);
-
-
return
0;
-
}
-
-
-
//--------------------------------------滑动条回调函数
-
//fGamma =50 原图
-
//fGamma <50 变亮
-
//fGamma >50 变暗
-
void on_Trackbar(int, void*)
-
{
-
float fGamma = (
float)g_fGammaValueSlider /
50;
-
Mat GammaImage;
-
unsigned
char lut[
256];
-
for (
int i =
0; i <
256; i++)
-
{
-
lut[i] =
saturate_cast<uchar>(
pow((
float)(i /
255.0), fGamma) *
255.0f);
-
}
-
GammaImage = srcImage.
clone();
-
-
MatIterator_<Vec3b> it, end;
-
for (it = GammaImage.
begin<Vec3b>(), end = GammaImage.
end<Vec3b>(); it != end; it++)
-
{
-
(*it)[
0] = lut[((*it)[
0])];
-
(*it)[
1] = lut[((*it)[
1])];
-
(*it)[
2] = lut[((*it)[
2])];
-
}
-
imshow(
"伽马矫正", GammaImage);
-
}
-
-
-
-
-
//------------------------实现三通道分离并显示
-
//Mat rgbChannels[3];
-
//Mat BlueChannelDisplay;
-
//Mat GreenChannelDisplay;
-
//Mat RedChannelDisplay;
-
//
-
//split(srcImage, rgbChannels);//三通道分离
-
-
//BlueChannelDisplay = rgbChannels[0];
-
// GreenChannelDisplay = rgbChannels[1];
-
//RedChannelDisplay = rgbChannels[2];
-
//
-
//namedWindow("raw picture");//raw
-
//imshow("raw picture", srcImage);
-
// waitKey(0);
-
-
// namedWindow("r_channel");//R
-
// imshow("r_channel", RedChannelDisplay);
-
// waitKey(0);
-
-
// namedWindow("g_channel");//G
-
// imshow("g_channel", GreenChannelDisplay);
-
// waitKey(0);
-
-
// namedWindow("b_channel");//B
-
// imshow("b_channel", BlueChannelDisplay);
-
// waitKey(0);
参考:
https://blog.csdn.net/qq_15971883/article/details/88699218
https://www.zhihu.com/question/21849710
https://zhuanlan.zhihu.com/p/410810114
https://blog.csdn.net/qq_38574198/article/details/108851134
转载:https://blog.csdn.net/peng_258/article/details/127352238