我想玩一些OpenCV,并想出了一个有趣的小场景工作。 (x,y),(x + 1,y)(x,y + 1)和(x + 1,y)的颜色值相加, y + 1))并将结果除以4得到平均颜色值。然后,我处理的下一组像素是(x + 2,y + 2),它有3个相邻像素。有效的方式访问opencv Mat元素
然后,我也希望能够做一个类似的事情,但与9像素(与选定的坐标作为中心工作)。
最初我从高斯模糊类型掩模开始,但这不是我想要的结果。从这些计算中,我只想得到1个像素值。所以输出图像将是1/4或1/9的大小。所以现在我已经得到了它的工作,我已经从字面上写出来的计算在for循环:
for (int i = 1; i < myImage.rows -1; i++)
{
b = 0;
for (int k = 1; k < myImage.cols -1; k++)
{
//9 pixel radius
Result.at<Vec3b>(a, b)[1] = (myImage.at<Vec3b>(i-1, k-1)[1]+myImage.at<Vec3b>(i-1, k)[1]+myImage.at<Vec3b>(i+1, k)[1] + myImage.at<Vec3b>(i, k)[1]+myImage.at<Vec3b>(i, k-1)[1]+myImage.at<Vec3b>(i, k+1)[1] + myImage.at<Vec3b>(i + 1, k+1)[1] + myImage.at<Vec3b>(i-1, k + 1)[1] + myImage.at<Vec3b>(i + 1, k - 1)[1])/9;
Result.at<Vec3b>(a, b)[2] = (myImage.at<Vec3b>(i-1, k-1)[2]+myImage.at<Vec3b>(i-1, k)[2]+myImage.at<Vec3b>(i+1, k)[2] + myImage.at<Vec3b>(i, k)[2]+myImage.at<Vec3b>(i, k-1)[2]+myImage.at<Vec3b>(i, k+1)[2] + myImage.at<Vec3b>(i + 1, k+1)[2] + myImage.at<Vec3b>(i-1, k + 1)[2] + myImage.at<Vec3b>(i + 1, k - 1)[2])/9;
Result.at<Vec3b>(a, b)[0] = (myImage.at<Vec3b>(i-1, k-1)[0]+myImage.at<Vec3b>(i-1, k)[0]+myImage.at<Vec3b>(i+1, k)[0] + myImage.at<Vec3b>(i, k)[0]+myImage.at<Vec3b>(i, k-1)[0]+myImage.at<Vec3b>(i, k+1)[0] + myImage.at<Vec3b>(i + 1, k+1)[0] + myImage.at<Vec3b>(i-1, k + 1)[0] + myImage.at<Vec3b>(i + 1, k - 1)[0])/9;
//4 pixel radius
// Result.at<Vec3b>(a, b)[1] = (myImage.at<Vec3b>(i, k)[1] + myImage.at<Vec3b>(i + 1, k)[1] + myImage.at<Vec3b>(i, k + 1)[1] + myImage.at<Vec3b>(i, k - 1)[1] + myImage.at<Vec3b>(i - 1, k)[1])/5;
// Result.at<Vec3b>(a, b)[2] = (myImage.at<Vec3b>(i, k)[2] + myImage.at<Vec3b>(i + 1, k)[2] + myImage.at<Vec3b>(i, k + 1)[2] + myImage.at<Vec3b>(i, k - 1)[2] + myImage.at<Vec3b>(i - 1, k)[2])/5;
// Result.at<Vec3b>(a, b)[0] = (myImage.at<Vec3b>(i, k)[0] + myImage.at<Vec3b>(i + 1, k)[0] + myImage.at<Vec3b>(i, k + 1)[0] + myImage.at<Vec3b>(i, k - 1)[0] + myImage.at<Vec3b>(i - 1, k)[0])/5;
b++;
}
a++;
}
显然,这是可以设置被称为两个选项不同的功能,但我我只是想知道是否有更高效的方法来实现这一点,这会让掩码的大小发生改变。
感谢您的帮助!
这听起来像你只是谈论与线性插值调整图像大小。 – beaker
您是否打算用opencv实现这种最高效的方式,或者您想学习如何使用opencv进行高效的像素访问? – bendervader
我的意图主要是找到一种更容易的方法来改变用于创建输出的像素的数量,而不仅仅是将其全部写出来,这与opencv相关。它能很好地使用输入算法。而不仅仅是一长串手写代码来完成一组不同的输入。 – FreakShow