矩阵的掩膜操作

掩膜操作

一、根据定义写出函数

获取图像像素指针
     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之间

程序

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

	using namespace cv;

	int main(int argc, char** argv){
	
		Mat src = imread("D:\sj.png");

		namedWindow("Window Title", WINDOW_AUTOSIZE);

		imshow("Window Title", src);


		int cols  = src.cols*src.channels();
		int offer = src.channels();
		int rows = src.rows;

		Mat dst = Mat::zeros(src.size(),src.type());


		for (int row = 1; row < rows - 1; row++)
		{
			const uchar* pre     = 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 = 3; col < cols - 3; col++)
			{
				output[col] = saturate_cast<uchar>( 5 * current[col] - (current[col - 3] + pre[col] + next[col] + current[col + 3]));

			}
	
		}

		namedWindow("Window dst", WINDOW_AUTOSIZE);
		imshow("Window dst", dst);
		//cvtColor(image, gray_image, COLOR_BGR2GRAY);
		waitKey(0);

		return 0;
	}

 

 

二、直接调用函数实现

函数调用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 = imread("D:\sj.png");
		Mat dst;

		namedWindow("Window Title", WINDOW_AUTOSIZE);

		imshow("Window Title", src);

		Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1,5, -1, 0, -1, 0);
		filter2D(src, dst, src.depth(), kernel);

		namedWindow("Window dst", WINDOW_AUTOSIZE);

		imshow("Window dst", dst);
	
		waitKey(0);

		return 0;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值