一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

获取图像像素指针
CV_Assert(myImage.depth() == CV_8U);

Mat.ptr(int i=0)获取像素矩阵指针,索引i表示第i行,从0开始计数;

获得当前指针const uchar* current = myImage.ptr(row);

获取当前像素点P(row, col)的像素值p(row, col) = current[col];

像素范围处理saturate_cast
saturate_cast(小于0的数), 返回0;

saturate_cast(大于255的数), 返回255;

saturate_cast(0-255之间的数), 返回输入的值本身;

这个函数的功能是,确保RGB值的范围处于0-255之间;’

提高图像对比度原理

通过计算,使得当前像素=5*当前像素-(左侧像素+右侧像素+上方像素+下方像素);

这样计算的目的是,使得图像中亮的部分更亮,暗的部分更暗,从而增加图像的对比度;

程序实现

复制代码
 1 #include <iostream>
 2 #include <opencv2/opencv.hpp>
 3 #include <math.h>
 4 
 5 using namespace std;
 6 using namespace cv;
 7 
 8 int main() {
 9     // 加载一张普通图片
10     Mat src, dst;
11     src = imread("C:\\Users\\Administrator\\Desktop\\background.png");
12     if (!src.data) {  // 判断是否获取到了图片
13         printf("Could not load image!\n");
14         return -1;
15     }
16     // 将这张普通图片显示出来
17     namedWindow("input image", WINDOW_AUTOSIZE);
18     imshow("input image", src);
19 
20     // 这里要用图片和掩膜做卷积操作,所以要把最外面的那一圈像素去掉
21     // 图像宽度 = 每一行像素点个数 X 每个像素点的通道数(如:RGB)
22     // 序号是从0开始的,所以-1后,相当于把第一个和最后一个像素点去掉
23     int cols = (src.cols-1) * src.channels();
24     int offsetx = src.channels();
25     // 获取图像高度
26     int rows = src.rows;
27     // 创建一个和载入图片相同大小的空的矩阵
28     dst = Mat::zeros(src.size(), src.type());
29 
30     // 序号是从第0行开始的,这样把第0行略过
31     for (int row = 1; row < (rows - 1); row++) {
32         const uchar* previous = src.ptr<uchar>(row - 1);  // 获取上一行指针
33         const uchar* current = src.ptr<uchar>(row);  // 获取当前行指针
34         const uchar * next = src.ptr<uchar>(row + 1);  // 获取下一行指针
35         // 创建一个行指针指向创建的空矩阵的对应行
36         uchar* output = dst.ptr<uchar>(row);
37         for (int col = offsetx; col < cols; col++) {
38             // 把每个像素的值限定在0-255之间
39             output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));
40         }
41     }
42 
43     // 显示提高对比度之后的图像
44     namedWindow("contrast image demo", WINDOW_AUTOSIZE);
45     imshow("contrast image demo", dst);
46 
47     waitKey(0);  // 让程序在这里卡住,不然会一下子退出
48 
49     return 0;
复制代码

运行效果

左侧为原图,右侧为处理后的图像:

函数调用filter2D功能
1、定义掩膜:Mat kernel = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

2、filter2D(src, dst, src.depth(), kernel); 其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24/8等;

程序实现

复制代码
 1 #include <iostream>
 2 #include <opencv2/opencv.hpp>
 3 #include <math.h>
 4 
 5 using namespace std;
 6 using namespace cv;
 7 
 8 int main() {
 9     // 加载一张普通图片
10     Mat src, dst;
11     src = imread("C:\\Users\\Administrator\\Desktop\\background.png");
12     if (!src.data) {  // 判断是否获取到了图片
13         printf("Could not load image!\n");
14         return -1;
15     }
16     // 将这张普通图片显示出来
17     namedWindow("input image", WINDOW_AUTOSIZE);
18     imshow("input image", src);
19 
20     // 使用内置的API
21     Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
22     filter2D(src, dst, src.depth(), kernel);
23 
24     // 显示提高对比度之后的图像
25     namedWindow("contrast image demo", WINDOW_AUTOSIZE);
26     imshow("contrast image demo", dst);
27 
28     waitKey(0);  // 让程序在这里卡住,不然会一下子退出
29 
30     return 0;
31 }
复制代码

通过调用API我们一样达到了同样的图片处理效果。

posted on   一杯清酒邀明月  阅读(1869)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示