图像处理之其他杂项(六)之Mat格式图像处理相关小事(像素越界,边界处理)

              图像处理之其他杂项(六)之Mat格式图像处理相关小事(像素越界,边界处理)

以现阶段知识水平总结,结论不一定正确

一、 像素存储

1.Mat图像单通道灰度图声明type可以是CV_8U,也可是CV_8UC1。。

  如:

Mat originImage (5,5,CV_8U,1);
Mat originImage (5,5,CV_8UC1,1);

              生成Mat如:

              2.灰度Mat中对应像素数值的存储是以<uchar>格式存储的,若按<uchar>数据提取:

	Mat originImage(5, 5, CV_8UC1,1);
	for (int i = 0; i < originImage.rows; i++)
	{
		for (int j = 0; j < originImage.cols; j++)
		{
			cout << originImage.at<uchar>(i, j) << "  ";
		}
		cout << endl;
	}

输出结果如下:

3. 若按<int>数据直接提取:

	Mat originImage(5, 5, CV_8UC1,1);
	for (int i = 0; i < originImage.rows; i++)
	{
		for (int j = 0; j < originImage.cols; j++)
		{
			cout << originImage.at<int>(i, j) << "  ";
		}
		cout << endl;
	}

结果如下:

4.按<uchar>转<int>提取

	Mat originImage(5, 5, CV_8UC1,1);
	for (int i = 0; i < originImage.rows; i++)
	{
		for (int j = 0; j < originImage.cols; j++)
		{
			int x = originImage.at<uchar>(i, j);
			cout <<x << "  ";
		}
		cout << endl;
	}

结果如下:

二、像素越界 

在查看平滑滤波相关知识的时候涉及一个问题,以一个3*3的滤波掩模去平滑图像时,当中心像素位于图像最外边界一圈时,处理的像素超出了图像范围(图1,以图像最左上角单个像素(0,0)为例),这时正常数据应该是溢出或越界了,但真实操作没有什么影响,程序会对超出图像范围的数据进行默认填充(具体原理未知,有待进一步研究,

(后续补充:这个地方说的数据填充存在不确定性,有些情况适用,有些情况程序会报错,具体情况具体分析)

在图1中,红框为原有3*3大小图像,以3*3掩模平滑图像时,先对像素(0,0)进行操作,此时共有5个像素超出边界,但能正常处理,像素填充如图2。

图1

查看数据填充代码如下:

	Mat originImage (3,3,CV_8UC1,1);
	int x;
	int n;
	for (int i = -3; i <5; i++)
	{
		for (int j = -3; j <5; j++)
		{
			 x = originImage.at<uchar>(i, j);
			 int y = (x+1);//以下多余代码为了每行的数据输出上下对齐,便于查看
			 for (n= 0; y > 0; n++)
			 {
				 y /= 10;
				 
			 }
			cout <<x;
			for (int i = 1; i < 6 - n; i++)
				cout << " ";
		}
		cout <<endl;
	}

 结果如下:红色标记范围内为原有生成Mat数据图像,其他数据均为越界自动生成数据。。

图2

猜你喜欢

转载自blog.csdn.net/coming_is_winter/article/details/88367391
今日推荐