【发布时间】:2015-07-06 19:55:40
【问题描述】:
我在 C++ 中有一个图像 img,大小为 mxn,在 OpenCV 中类型为 CV_8UC3。
我有另一个向量b,大小为1xn,将img“水平”分成两部分:
upper_part = {(row,col)|1<=col<=n, 1<=row<=b(1,col)}
lower_part = {(row,col)|1<=col<=n, b(1,col)<row<=m},
其中 1
对于图像的这两个部分,我希望有协方差矩阵 M_u 和 M_l 排序的“每个”通道。这意味着生成的矩阵的大小应该是 3x3,并且应该像这样导出:
M_u = 1/(N_u-1) * sum_{(row,col)\in upper_part} (img(row,col)-mu_u)*(img(row,col)-mu_u)^T,
其中 N_u 是上部元素的数量, mu_u 是描述上部平均 RGB 值的 3x1 向量,img(row,col) 是 3x1 向量,在位置 (row,col) 处具有 img 的 RGB 值。考虑到lower_part,M_l 与 N_l 和 mu_l 等效计算。
此外,我还(有时)必须计算CV_8UC1 图像的协方差。当然,矩阵只是一个标量。
是否有主要针对 CV_8UC3 类型的解决方案,如果有,是否有适用于 CV_8UC1 类型图像的解决方案?
我当前的解决方案是遍历每个像素并通过分别获取 img.at<Vec3b>(row,col) 或 img.at<unsigned char>(row,col) 的值来计算它(首先是平均值,然后是协方差,因此对所有像素进行两个循环),但是我'听说过,现在看到的是这个功能效率很低/很慢。由于我必须在循环中执行计算M_u 和M_l 的过程,因此我想有效地导出协方差。
有什么想法吗?
谢谢。
PS:m~1280 和 n~960。
【问题讨论】:
-
没人知道吗?我想我必须做循环。但是我能以某种方式避免这个缓慢的 .at() 函数吗?
-
任何避免
.at<.,.>(.,.)的想法都会有所帮助。
标签: c++ opencv matrix covariance