• openCV


    获取图像像素指针、掩膜操作解释

    获取图像像素指针

    • 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对象

    函数调用filter2D功能

    1. 定义掩膜:``Mat kernel = (Mat_<char>(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 <opencv2/opencv.hpp>
    #include <iostream>
    #include <math.h>
    
    using namespace cv;
    
    int main(int argc, char** argv) {
      // 加载图片
    	Mat src, dst;
    	src = imread("D:/vcprojects/images/test.png");
    	if (!src.data) {
    		printf("could not load image...
    ");
    		return -1;
    	}
    	namedWindow("input image", CV_WINDOW_AUTOSIZE);
    	imshow("input image", src);
    	
    	
    	int cols = (src.cols-1) * src.channels();
    	int offsetx = 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<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]));
    		}
    	}
    	
    	double t = getTickCount();
      // 调用filter2D
    	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0,   // 定义掩膜
                                       -1, 5, -1, 
                                        0, -1, 0);
    	filter2D(src, dst, src.depth(), kernel); // 相关参数
      
    	double timeconsume = (getTickCount() - t) / getTickFrequency();
    	printf("tim consume %.2f
    ", timeconsume);
    
    	namedWindow("contrast image demo", CV_WINDOW_AUTOSIZE);
    	imshow("contrast image demo", dst);
    
    	waitKey(0);
    	return 0;
    }
    
  • 相关阅读:
    PAT B1045 快速排序 (25 分)
    PAT B1042 字符统计 (20 分)
    PAT B1040 有几个PAT (25 分)
    PAT B1035 插入与归并 (25 分)
    PAT B1034 有理数四则运算 (20 分)
    PAT B1033 旧键盘打字 (20 分)
    HDU 1231 最大连续子序列
    HDU 1166 敌兵布阵
    HDU 1715 大菲波数
    HDU 1016 Prime Ring Problem
  • 原文地址:https://www.cnblogs.com/coderzjz/p/13182626.html
Copyright © 2020-2023  润新知