图像处理之其他杂项(六)之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。
查看数据填充代码如下:
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数据图像,其他数据均为越界自动生成数据。。