假设我有一个图像矩阵,我就像这样的特定像素[比如4]:
0 1 2
3 `4` 5
6 7 8
我试图遍历所有像素并试图访问0,1,2,3,5 6,7,8,其值存储在名为Pixel
的数组中....这里是我尝试使用OpenCV时,请告诉我哪里出错了。
我使用指针temp_ptr
来访问IplImage image
。
uchar* temp_ptr=0 ;
CvScalar Pixel[3][3];
int rows=image->height,cols=image->width,row,col;
for( row = 0; row < rows-2; ++row)
{
for ( col = 0; col < cols-2; ++col)
{
temp_ptr = &((uchar*)(image->imageData + (image->widthStep*row)))[col*3];
for (int krow = -1 ; krow <= 1; krow++)
{
for (int kcol = -1; kcol <= 1; kcol++)
{
temp_ptr = &((uchar*)(image->imageData + (image->widthStep*row+krow)))[(col+kcol)*3];
for(int i=0; i < 3; i++)
{
for(int j=0; j < 3; j++)
{
for(int k=0; k < 3; k++)
{
Pixel[i][j].val[k]=temp_ptr[k];
}
}
}
}
}
}
}
我不确定如何使用temp_ptr
加载周围的像素,请帮助我。
答案 0 :(得分:1)
先生,听起来你想要进行卷积,当你在指尖触摸OpenCV时这样做有点像在你的Spaghettios上敲打一个开罐器,用钝力将它打开。
事实上,你所做的几乎就是cv::blur(src, dst, cv::Size(3,3))
的输出,除了它还包括平均值的中心像素。
如果要排除中心像素,则可以创建自定义内核 - 只需一个具有适当权重的矩阵:
[.125 .125 .125
.125 0 .125
.125 .125 .125 ]
并将其应用于cv::filter2d(src, dst, -1, kernel)
的图片。
答案 1 :(得分:0)
假设image->imageData
是RGB格式,那么每个像素有3个字节,你可以这样做:
int rows = image->height;
int cols = image->width;
uchar* temp_ptr = 0;
CvScalar pixels[8];
for (int col = 0; col < image->height - 2; col++) {
temp_ptr = image->imageData + image->width * col + 1;
for (int row = 0; row < image->width - 2; row++) {
temp_ptr += row * 3;
pixels[0].val = temp_ptr - width * 3 - 3; // pixel 0 from your example
pixels[1].val = temp_ptr - width * 3; // 1
pixels[2].val = temp_ptr - width * 3 + 3; // 2
pixels[3].val = temp_ptr - 3; // 4
pixels[4].val = temp_ptr + 3; // etc...
pixels[5].val = temp_ptr + width * 3 - 3;
pixels[6].val = temp_ptr + width * 3;
pixels[7].val = temp_ptr + width * 3 + 3;
// calculate averages here and store them somewhere (in a vector perhaps)
}
}
注意我没有测试此代码。
答案 2 :(得分:0)
首先,你必须开始学习一些编程。你的完整代码是一团糟。 我可以很快发现一些主要问题:
另一个
temp_ptr = &((uchar*)(image->imageData + (image->widthStep*row+krow)))[(col+kcol)*3];
有一个小问题,运算符优先级应该是:
temp_ptr = &((uchar*)(image->imageData + image->widthStep*(row+krow))[(col+kcol)*3];
还不清楚你想要做什么,你想得到一个特定像素的邻域(然后你不需要循环)或你想要从图像中的每个像素应用内核。