设为首页收藏本站 |天气与日历| 2025-08-23 星期六 02:22:00 乙巳(蛇)年 七月初一 丑时 处暑
     
切换到窄版

私人站点

 找回密码
 立即注册
搜索
查看: 305|回复: 0

矩阵的掩膜操作(对比度提高)

[复制链接]

954

主题

954

帖子

3879

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3879
发表于 2022-2-19 21:04:55 | 显示全部楼层 |阅读模式
获取图像像素指针

CV_Assert(myImage.depth() == CV_8U);
Mat.ptr<uchar>(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
获得当前行指针const uchar*  current= myImage.ptr<uchar>(row );
获取当前像素点P(row, col)的像素值 p(row, col) =current[col]



像素范围处理saturate_cast<uchar>


saturate_cast<uchar>(-100),返回 0。
saturate_cast<uchar>(288),返回255
saturate_cast<uchar>(100),返回100
这个函数的功能是确保RGB值得范围在0~255之间



掩膜操作实现图像对比度调整 -红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作,得到最终结果就是对比度提高之后的输出图像Mat对象

图片1.png
5*I 代表需要处理的图像
(i,j)代表一个像素 i:行 j:列


[C++] 纯文本查看 复制代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
/*
对比度提高 算法  并且学习通过指针访问像素数据
*/
int main() {

        Mat src = imread("0.jpg");  
        Mat dst;
        if (!src.data) {
                return 0;  //利用data判断.如果没有数据直接退出
        }
        namedWindow("input image", CV_WINDOW_AUTOSIZE);
        imshow("input image", src);
        int cols = (src.cols-1) * src.channels();
        //图形的宽度=cols乘以图像的通道数

        int offsetx = src.channels();  //获取通道数

        int rows = src.rows;
        //图形的高度
        
        dst = Mat::zeros(src.size(), src.type());
        //zeros 同步原图大小

        for (int row = 1; row < rows-1; row++)
        {
                const uchar* previous = src.ptr<uchar>(row - 1);//获取上行的指针
                const uchar * current= src.ptr<uchar>(row); //获取当前行的指针
                const uchar* next = src.ptr<uchar>(row + 1); //获取下行的指针
                uchar * output = dst.ptr<uchar>(row);
                for (int col = offsetx; col < cols; col++)
                {
                        //套用公式
                        output[col] = saturate_cast<uchar> (5 * current[col] - (current[col - offsetx] + current[col+offsetx ]+previous[col]+next[col]));
                }

        } 
        namedWindow("contrast image demo", CV_WINDOW_AUTOSIZE);
        //创建新窗口
        imshow("contrast image demo",dst);
        //显示新图像
        waitKey(0);
        return 0;

}

函数调用filter2D功能
定义掩膜:Mat kernel = (Mat_<char>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D( src, dst, src.depth(), kernel );其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24、8等。
[C++] 纯文本查看 复制代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
/*
对比度提高 通过函数调用filter2D功能直接实现

*/
int main() {

        Mat src = imread("0.jpg");  
        Mat dst;
        if (!src.data) {
                return 0;  //利用data判断.如果没有数据直接退出
        }
        namedWindow("input image", CV_WINDOW_AUTOSIZE);
        imshow("input image", src);



        Mat kernel = (Mat_<char>(3, 3) <<
                0, -1, 0,
                -1, 5, -1,
                0, -1, 0);
        //定义掩膜
        filter2D(src, dst, src.depth(), kernel);
        //其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24、8等。
        namedWindow("contrast image demo", CV_WINDOW_AUTOSIZE);
        //创建新窗口
        imshow("contrast image demo",dst);
        //显示新图像
        waitKey(0);
        return 0;

}

最终处理效果:
1111.jpg
参考资料:
https://jingyan.baidu.com/article/597a06433583dc312b52439a.html
https://blog.csdn.net/bitcarmanlee/article/details/79132017
https://blog.csdn.net/qq_41480046/article/details/86563247


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|编程站点 ( 冀ICP备2023028127号-2 )|友链申请|

GMT+8, 2025-8-23 02:22 , Processed in 0.076497 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表