zoukankan      html  css  js  c++  java
  • OpenCV 图像锐化处理、提高图像对比度

    获取图像像素指针
    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!
    ");
    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!
    ");
    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我们一样达到了同样的图片处理效果。

  • 相关阅读:
    解决bash: less: command not found
    IDEA-相关插件使用
    如何理解多租户架构?
    mybatis自动生成model、dao及对应的mapper.xml文件
    IDEA设置提示生成序列化ID
    [DUBBO] qos-server can not bind localhost:22222错误解决
    @NotNull,@NotEmpty,@NotBlank区别
    (三)IDEA使用,功能面板
    PHP实现自己活了多少岁
    使用PHP函数输出前一天的时间和后一天的时间
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15183415.html
Copyright © 2011-2022 走看看