我在im
中有彩色图像,我想使用vec3b使用以下代码获取3个通道图像的像素值
for (int i = 0; i < im.rows; i++)
{
for (int j = 0; j < im.cols; j++)
{
for (int k = 0; k < nChannels; k++)
{
zay[k] = im.at<Vec3b>(i, j)[k]; //get the pixel value and assign to new vec3b variable zay
}
}
}
之后,我想在zay中将以下mat 3x3过滤器与vec3b相乘
Filter= (Mat_<double>(3, 3) << 0, 0, 0,
0, 1, 0,
0, 0, 0);
如何将vec3b转换为mat矩阵,这样我就可以使用mat Filter? vec3b是一个3x1阵列? 感谢
答案 0 :(得分:3)
根据您的示例,您要完成的操作称为内核卷积。
您可以设置内核并调用cv::filter2D()
为您应用它:
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main()
{
cv::Mat img = cv::imread("input.jpg");
if (img.empty())
{
std::cout << "!!! Failed to open input image" << std::endl;
return -1;
}
cv::Mat kernel = (cv::Mat_<float>(3, 3) << 0, 0, 0,
0, 1, 0,
0, 0, 0);
cv::Mat dst;
cv::filter2D(img, dst, -1, kernel, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);
cv::imshow("output", dst);
cv::waitKey(0);
return 0;
}
因此,无需迭代像素并自行执行计算。 OpenCV文档解释了所有内容:Making your own linear filters!。
答案 1 :(得分:1)
没有尝试,但应该工作:
cv::Mat DoubleMatFromVec3b(cv::Vec3b in)
{
cv::Mat mat(3,1, CV_64FC1);
mat.at <double>(0,0) = in [0];
mat.at <double>(1,0) = in [1];
mat.at <double>(2,0) = in [2];
return mat;
};