我正在将用 Matlab 编写的代码翻译成 OpenCV。在 Matlab 中,有 ordfilt2 函数。OpenCV中是否有类似的实现?谢谢
问问题
2129 次
3 回答
1
我使用 OpenCV 中的腐蚀或膨胀在 Matlab 中实现了 ordfilt2()。在 Matlab 中是腐蚀函数,可以在 OpenCVordfilt2(A,1,ones(3,3))
中替换。cv::erode(im, mx, mk,cv::Point(-1,-1),1,BORDER_CONSTANT );
Matlab 中的 ordfilt2(A,9,ones(3,3)) 是膨胀的,可以用cv::dilate(im, mx, mk,cv::Point(-1,-1),1,BORDER_CONSTANT );
.
于 2013-05-29T03:59:58.650 回答
0
我不认为有一个通用的。浏览此处以查找是否适合您。
来自 Matlab 帮助:
B = ordfilt2(A, order, domain) 将 A 中的每个元素替换为由 domain 中的非零元素指定的有序邻居集中的 orderth 元素。
所以你有一个图像 A,你的幻灯片有一个内核(域),它对像素值进行排序,你总是选择一个特定的顺序。
OpenCV 步骤(用于灰度图像):
1)克隆图像画布
2)在画布的每个像素上滑动
3)在图像上创建相同像素的子区域的矢量
4)对向量进行排序
5) 将新的图像像素值设置为所需的向量元素。
于 2013-05-22T11:06:26.107 回答
0
dilation = ordfilt2(proj, 5, ones(1,5)); %in matlab
Following is my implementation in opencv, proj is 1D matrix of size (26,1)
Mat dilation = proj.clone(); Mat array = Mat::zeros(5, 1, CV_32FC1);
for (int i = 0; i < 26; i++)
{
(i - 2) < 0 ? array.at<float>(0, 0) = 0 : array.at<float>(0, 0) = proj.at<float>(i - 2, 0);
(i - 1) < 0 ? array.at<float>(1, 0) = 0 : array.at<float>(1, 0) = proj.at<float>(i - 1, 0);
(i) < 0 ? array.at<float>(2, 0) = 0 : array.at<float>(2, 0) = proj.at<float>(i, 0);
(i + 1) >= 26? array.at<float>(3, 0) = 0 : array.at<float>(3, 0) = proj.at<float>(i + 1, 0);
(i + 2) >= 26? array.at<float>(4, 0) = 0 : array.at<float>(4, 0) = proj.at<float>(i + 2, 0);
float temp = 0;
for (int j = 0; j < 5; j++)
{
if (temp < array.at<float>(j, 0))
temp = array.at<float>(j, 0);
}
dilation.at<float>(i, 0) = temp;
}
于 2016-04-03T10:41:50.940 回答