OpenCV图像处理---掩膜操作

Mat imread(const string& filename,int flags=1)
  • 函数介绍:函数imread返回Mat类型的值,如果读取文件失败,函数会返回一个空矩阵,那么 srcImage.data 的值是 NULL,因此正常读取完文件后,我们可以利用 srcIamge.data 或 srcImage.enpty() 函数进行返回值检查,以确保文件正常载入。
  • 参数介绍:imread 功能是加载图像文件成为一个 Mat 对象,其中第一个参数表示 图像文件名称 。第二个参数表示 读取图像的颜色类型(默认参数是1) ,返回3通道图像,支持常见的三个参数值:
IMREAD_UNCHANGED = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
IMREAD_GRAYSCALE = 0,  //!< If set, always convert image to the single channel grayscale image (codec internal conversion).
IMREAD_COLOR = 1,      //!< If set, always convert image to the 3 channel BGR color image.

OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载

//修改图像
cvtColor( image, gray_image, COLOR_BGR2GRAY );
  • cvtColor的功能是把图像从一个彩色空间转换到另外一个色彩空间,有三个参数,
    第一个参数表示源图像、
    第二参数表示色彩空间转换之后的图像、
    第三个参数表示源和目标色彩空间如:COLOR_BGR2HLS 、COLOR_BGR2GRAY 等

获取图像像素指针

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

像素范围处理

saturate_cast //防止溢出

掩膜操作

掩膜操作可以提高图像对比度,对比度提高可以增加图像感官度、锐化,让看起来有点模糊的图像更清晰

红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作,得到最终结果就是对比度提高之后的输出图像Mat对象。
OpenCV图像处理---掩膜操作_第1张图片

  • 矩阵的掩膜操作十分简单,根据掩膜来重新计算每个像素的像素值,掩膜(mask 也被称为Kernel)

  • 掩膜矩阵 3*3 在图像矩阵上移动与图像重合,与每一个重合的像素点做掩膜操作,

  • 公式:中心点掩膜后的颜色数据 I(i,j)=5∗I(i,j)−[I(i−1,j)+I(i+1,j)+I(i,j−1)+I(i,j+1)] I(i,j) = 5*I(i,j) - [I(i-1,j)+I(i+1,j)+I(i,j-1)+I(i,j+1)]I(i,j)=5∗I(i,j)−[I(i−1,j)+I(i+1,j)+I(i,j−1)+I(i,j+1)]

  • 这里是3*3的矩阵,所以图像数据的第一行倒数第一行,第一列倒数第一列不做掩膜操作 。其中: i,j 表示像素的位置,第 i 行,第 j 列, I(i,j) 表示每个通道颜色数据。

  • 掩膜操作不是矩阵乘法,由公式可以看出

程序代码

#include
#include
#include

using namespace cv;

int main(int argc,char** argv){
	Mat src,dst;
	src=imread("dog2.jpg");

	if(!src.data){
		printf("could not load image ...");
		return -1;
	}
	//CV_Assert(src.depth()==CV_8U);
	
	//掩膜操作
	int channels=src.channels();//图像的通道数
	int cols=(src.cols)*src.channels();//列数*通道数
	int rows=src.rows;//行数

	dst=Mat::zeros(src.size(),src.type());//初始化 dst

	for(int row=1 ; row(row - 1);//上一行
		const uchar* current=src.ptr(row);//当前行
		const uchar* next =src.ptr(row + 1);//下一行

		uchar* output=dst.ptr(row);
		for(int col=1*channels ; col( 5 * current[col] - (previous[col] + next[col] + current[col + channels] + current[col + channels]));
		}
	
	}

	namedWindow("output1",WINDOW_AUTOSIZE);
	imshow("output1",src);

	namedWindow("output2",WINDOW_AUTOSIZE);
	imshow("output2",dst);

	waitKey(0);

	return 0;
}

OpenCV提供一个函数实现掩膜操作

//定义一个掩膜
Mat kernel=(Mat_(3,3)<< 0, -1, 0, -1, 5, -1 , 0, -1, 0);
filter2D( src, dst, src.depth(), kernel );

程序代码

#include
#include
#include

using namespace cv;

int main(int argc,char** argv){
	Mat src,dst;
	src=imread("dog2.jpg");

	if(!src.data){
		printf("could not load image ...");
		return -1;
	}


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

	namedWindow("output1",CV_WINDOW_AUTOSIZE);
	imshow("output1",src);

	namedWindow("output2",CV_WINDOW_AUTOSIZE);
	imshow("output2",dst);

	waitKey(0);

	return 0;
}

测试运行时间

......
......
int main()
{
	double t=getTickCount();  //返回刻度数
    
	//......
    //要执行的内容
    //......
    //getTickFrequency() 返回每秒走的刻度数
    double timeConsume = (getTickCount() - t) / getTickFrequency();
	printf("time consume %.2f",timeConsume);

	return 0;
}

你可能感兴趣的:(OpenCV图像处理---掩膜操作)