学习OPENCV3.1.0-2-矩阵的掩膜操作

学习OPENCV3.1.0 -2- 矩阵的掩膜操作

1.获取图像像素指针

· CV_Assert(myImage.depth() == CV_8U);
该函数用于判断输入图像数据为无符号字符格式:

CV_Assert函数:当它的表达式为假(Flase)时,会抛出一个错误]:

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

· 获得当前行指针

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);

· 获取当前像素点P(row, col)的像素值

 p(row, col) =current[col]

2.像素范围处理saturate_cast

· saturate_cast(-100),返回 0。

· saturate_cast(288),返回255

· saturate_cast(100),返回100

· 这个函数的功能是确保RGB值得范围在0~255之间

3.API-filter2D

void filter2D(InputArray src, 
			OutputArray dst, 
			int ddepth,
			InputArray kernel,
			Point anchor=Point(-1,-1), 
			double delta=0, 
			int borderType=BORDER_DEFAULT )

· src - 输入图像 dst - 输出图像

· ddepth – 输出图像的深度,如果该值设为负数则输出图像和输入图像有相同的通道数。ddepth可以根据以下罗列的方式设定。

src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_64F, ddepth = -1/CV_64F

· kernel – 卷积核 (or rather a correlation kernel), 为一个单通道的浮点型矩阵; 对于多通道的彩色图像,如果要对每一通道计算卷积,请使用split()函数将图像分割为多个通道,然后各个通道分别进行卷积处理。

Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, dst, src.depth(), kernel);
//src.depth()如果用-1代替,就默认和输入图像一样。

4.掩膜操作(图像对比度调整)

· 红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作,得 到最终结果就是对比度提高之后的输出图像Mat对象
在这里插入图片描述

5.代码演示

#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...\n");
		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());
	//Mat::zeros函数功能:dst的大小,类型和原图像一致
	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();
	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();
    /*
    	getTickCount():用于返回从操作系统启动到当前所经的计时周期数
    	getTickFrequency():用于返回CPU的频率。get Tick Frequency。这里的单位是秒,也就是一秒内重复的次数。
    */
	printf("tim consume %.2f\n", timeconsume);

	namedWindow("contrast image demo", CV_WINDOW_AUTOSIZE);
	imshow("contrast image demo", dst);

	waitKey(0);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值