色彩均衡化
色彩均衡化(或称为直方图均衡化)是一种图像处理技术,目的是改善图像的对比度,使图像中的细节更加明显。它通过重新分配颜色通道的像素值,使得图像的直方图分布更均匀。以下是其基本原理:
原理
-
直方图计算:
- 首先计算图像的颜色直方图,即统计每个像素值出现的频率。对于每个颜色通道(红、绿、蓝),都会生成一个直方图。
-
累积分布函数(CDF):
- 计算每个颜色通道的累积分布函数。CDF 是对直方图的累加,用于描述某个像素值及以下的所有像素所占的比例。
-
归一化:
- 将 CDF 归一化到 0 到 255 的范围(对于8位图像),这样就能将累积的频率转换为新的像素值。
-
映射:
- 使用归一化后的 CDF,将原图像中的每个像素值映射到新的像素值。具体来说,对于每个像素,根据其原始值查找 CDF,得到新的值,从而完成均衡化。
-
重建图像:
- 使用新的像素值构建一幅新的图像,这幅图像的直方图分布更加均匀,增强了整体的对比度。
应用
色彩均衡化通常用于:
- 改善低对比度图像的可视性。
- 处理医学影像、卫星图像等需要突出细节的图像。
注意事项
- 伪彩色问题:对彩色图像进行均衡化时,可以单独对每个通道进行,也可以转换到不同的颜色空间(如HSV、Lab等)进行均衡化,然后再转换回RGB。
- 局部均衡化:可以使用局部均衡化(如自适应直方图均衡化,CLAHE)来处理局部对比度差异,避免全局均衡化带来的过度增强。
总结
色彩均衡化是一个强大的工具,能够通过调整图像中的像素分布来改善图像的视觉效果。在实际应用中,可以结合其他图像处理技术来获得更好的效果。
Mat Equalizer(Mat src) {
int row = src.rows;
int col = src.cols;
int Count[256] = { 0 };
float p[256] = { 0 };
float fSum[256] = { 0 };
int level[256] = { 0 };
int Total = row * col * 3;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
for (int k = 0; k < 3; k++) {
Count[src.at<Vec3b>(i, j)[k]]++;
}
}
}
for (int i = 0; i < 256; i++) {
p[i] = 1.0 * Count[i] / (1.0 * Total);
if (i == 0)
fSum[0] = p[0];
else
fSum[i] = fSum[i - 1] + p[i];
level[i] = saturate_cast<uchar>(255 * fSum[i] + 0.5);
}
Mat dst(row, col, CV_8UC3);
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
for (int k = 0; k < 3; k++) {
dst.at<Vec3b>(i, j)[k] = level[src.at<Vec3b>(i, j)[k]];
}
}
}
return dst;
}
PS中值模糊
中值模糊是一种图像处理技术,常用于去噪声和图像平滑。在Photoshop中的模糊滤镜中,中值模糊通过替换每个像素的值为其邻域像素值的中值,来达到模糊效果。其算法原理可以简单概括如下:
中值模糊算法原理
-
选择窗口:对于每个像素,选择一个窗口(如3x3、5x5等),包括该像素及其周围像素。窗口大小决定了模糊效果的程度,窗口越大,模糊效果越明显。
-
提取邻域像素值:在选定的窗口内,提取出所有的像素值。
-
计算中值:
- 对提取的像素值进行排序。
- 找到中间的值,这个值称为中值。在奇数个像素的情况下,中值为排序中间位置的值;在偶数个像素的情况下,可以取中间两个数的平均值。
-
替换像素值:将当前素的值替换为计算得到的中值。
-
逐步处理图像:对图像中的每一个像素重复以上步骤,直到处理完整个图像。
优点与应用
- 去噪能力强:中值模糊特别有效于去除椒盐噪声。
- 边缘保留:相较于其他模糊算法(如高斯模糊),中值模糊在保持边缘信息上更具优势。
注意事项
- 处理速度:由于需对每个像素都进行排序,计算复杂度较高。在大图像和大窗口时,处理时间会显著增加。
- 选择窗口大小:合适的窗口大小可以使模糊效果更自然,过大的窗口可能会导致细节过度模糊。
中值模糊在图像处理领域广泛应用,尤其在图像噪声减少和图像预处理等方面。
Mat MedianFilter(Mat src, int ksize) {
int row = src.rows;
int col = src.cols;
int border = (ksize - 1) / 2;
int mid = (ksize*ksize - 1) / 2;
Mat dst(row, col, CV_8UC3);
for (int i = border; i < row - border; i++) {
for (int j = border; j < col - border; j++) {
for (int k = 0; k < 3; k++) {
vector <int> v;
for (int x = -border; x <= border; x++) {
for (int y = -border; y <= border; y++) {
v.push_back(src.at<Vec3b>(i + x, j + y)[k]);
}
}
sort(v.begin(), v.end());
dst.at<Vec3b>(i, j)[k] = v[mid];
}
}
}
return dst;
}
PS运动模糊
运动模糊(Motion Blur)是一种在摄影和图像编辑中常用的效果,它模拟了在快速运动中的物体拍摄时因快门速度较慢而导致的模糊效果。在Adobe Photoshop中,运动模糊的效果可以通过应用特定的滤镜来实现。以下是运动模糊效果的基本原理和实现方法:
原理:
- 快门速度:当物体以较高速度移动时,快门捕捉到的图像会出现模糊,这是因为在曝光时间内,物体位于不同的位置。
- 方向和速度:运动模糊不仅依赖于速度,还与物体移动的方向相关。模糊的方向通常与物体移动的方向一致,而模糊的强度与物体的速度成正比。
- 光线的牵引效应:在摄影中,快速移动的物体会在图像中留下光线轨迹,形成流畅的模糊效果。这种效果可以增强动态感,使静态图像看起来更生动。
在Photoshop中实现运动模糊:
- 选择图层:打开你想要编辑的图像,并选择需要应用运动模糊的图层。
- 应用运动模糊滤镜:
- 前往菜单选择
滤镜
>模糊
>运动模糊
。 - 在弹出的对话框中,可以调整模糊的角度和距离。角度决定模糊的方向,距离则决定模糊的强度。
- 前往菜单选择
- 调整效果:根据需要进行细微调整,可以使用图层蒙版等工具来控制模糊效果的应用区域。
- 其他技巧:结合图层样式、透明度或其他滤镜,可以进一步增强运动模糊效果。例如,在运动模糊的基础上添加一些光晕或色调变化,可以让图像更具视觉冲击力。
总结:
运动模糊效果在Photoshop中通过模拟光线在快速移动物体上的表现来增加图像的动感和速度感。掌握运动模糊的滤镜及其参数调整,可以帮助用户在创作中更好地表现运动和速度。
//添加运动模糊效果
//angle:运动的方向,distance:运动的距离
//这里只是粗略的计算,以dx的长度为准,也可以以dy或者dx+dy等长度微赚
Mat MotionBlur(const Mat &src, int angle = 30, int distance = 100) {
if (distance < 1) distance = 1;
else if (distance > 200) distance = 200;
double radian = ((double)angle + 180.0) / 180.0 * PI;
int dx = (int)((double)distance * cos(radian) + 0.5);
int dy = (int)((double)distance * sin(radian) + 0.5);
int sign;
if (dx < 0) sign = -1;
if (dx > 0) sign = 1;
int height = src.rows;
int width = src.cols;
int chns = src.channels();
Mat dst;
dst.create(height, width, src.type());
for (int i = 0; i < height; i++) {
unsigned char* dstData = (unsigned char*)dst.data + dst.step * i;
for (int j = 0; j < width; j++) {
for (int k = 0; k < chns; k++) {
int sum = 0, count = 0;
for (int p = 0; p < abs(dx); p++) {
int i0 = i + p*sign;
int j0 = j + p*sign;
if (i0 >= 0 && i0 < height && j0 >= 0 && j0 < width) {
count++;
sum += src.at<Vec3b>(i0, j0)[k];
}
}
if (count == 0) {
dstData[j*chns + k] = src.at<Vec3b>(i, j)[k];
}
else {
dstData[j*chns + k] = int(sum / (double)count + 0.5);
if (dstData[j*chns + k] < 0) dstData[j*chns + k] = 0;
else if (dstData[j*chns + k] > 255) dstData[j*chns + k] = 255;
}
}
}
}
return dst;
}
更多PS代码请关注我上传的资源文件。
https://download.csdn.net/download/m0_44975814/89896121
标签:Photoshop,src,int,模糊,像素,++,算法,图像 From: https://blog.csdn.net/m0_44975814/article/details/143186032