OpenCV笔记(二)矩阵的掩膜操作

文章目录

  • 一、获取图像像素指针
  • 二、像素范围处理
  • 三、掩膜操作实现图像对比度调整
  • 四、综合例程
    • 函数调用filter2D功能
  • 五、附注
    • 1.OpenCV坐标系与row&col的关系
    • 2.getTickCount() & getTrickFrequency()

一、获取图像像素指针

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

二、像素范围处理

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

三、掩膜操作实现图像对比度调整

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

    OpenCV笔记(二)矩阵的掩膜操作_第1张图片

    • 矩阵的掩膜操作十分简单,根据掩膜来重新计算每个像素的像素值,掩膜(mask,也被称为kernel)
    • 通过掩膜操作实现图像对比度提高。

    OpenCV笔记(二)矩阵的掩膜操作_第2张图片

四、综合例程

#include 
#include 
#include 
using namespace cv;
int main(int argc,char** argv)
{
    Mat src,dst;
    src = imread("1.jpg");
    if(!src.data)
    {
        printf("could not load image...\n");
        return -1;
    }
    nameWindow("input image",CV_WINDOW_AUTOSIZE);
    imshow("input_image",src);
    
    int cols = (src.cols-1)*src.channnels();
    int offset = src.channels();
    int rows = src.rows;
    
    dst = Mat::zeros(src.size(),src.type() );
    for(int row = 1;row < (rows - 1); row++)
    {
        const uchar* previous = src.ptr(row - 1);
        const uchar* current = src.ptr(row);
        const uchar* next = src.ptr(row + 1);
        uchar* output = dst.ptr(row);
        for(int col = offsetx; col < cols; col++)
        {
            output[col] = saturate_cast(5 *current[col] - (current[col-offsex) + current[col+offset] + previous[col] + next[col]));
        }
        nameWindow("contrast.image.demo",CV_WINDOW_AUTOSIZE);
 		imshow("contrast.image.demo",dst);   
                                                                            	waitKey(0);
    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等。
#include 
#include 
#include 
using namespace cv;
int main(int argc,char** argv)
{
    Mat src,dst;
    src = imread("1.jpg");
    if(!src.data)
    {
        printf("could not load image...\n");
        return -1;
    }
    nameWindow("input image",CV_WINDOW_AUTOSIZE);
    imshow("input_image",src);
	
    double t = getTickCount();
    Mat kernel = (Mat_(3,3)<<0, -1, 0, -1, 5, -1, 0, -1, 0 );
    filter2D(src, dst, src.depth(), kernel);
    double timeconsume = (getTickCount() - t) / getTrickFrequency();//计算程序运行的时间
    printf("contrast.image.demo",dst);
    
    nameWindow("contrast.dst.image.demo",CV_WINDOW_AUTOSIZE);
    imshow("contrast.image.demo",dst);
    
    waitKey(0);
    return 0;
}

五、附注

1.OpenCV坐标系与row&col的关系

Mat::at(x,y) 和 Mat::at( Point(x, y) )的区别

参考文档

row == heigh == Point.y

col == width == Point.x

Mat::at(Point(x, y)) == Mat::at(y,x)

2.getTickCount() & getTrickFrequency()

  • getTickCount():用于返回从操作系统气筒到当前所经的计时周期数。

  • getTcikFrequency():用于返回CPU的频率。(C++中单位为秒,也就是每秒重复的次数
    .getTickCount() & getTrickFrequency()

  • getTickCount():用于返回从操作系统气筒到当前所经的计时周期数。

  • getTcikFrequency():用于返回CPU的频率。(C++中单位为秒,也就是每秒重复的次数

  • (getTickCount() - t) / getTcikFrequency():(当前次数-开始计时次数)/每秒重复次数=从开始到当前所用时间(s)

你可能感兴趣的:(#,OpenCV图像处理)