我正在尝试将图像的像素值(例如80x20)从最低到最高排序。
以下是一些代码:
bool sortPixel(int first, int second)
{
return (first < second);
}
vector<int>vect_sortPixel;
for(int y=0; y<height; y++)
{
for(int x=0; x<width; x++)
{
vect_sortPixel.push_back(cvGetReal2D(srcImg, y, x));
sort(vect_sortPixel.begin(), vect_sortPixel.end(), sortPixel);
}
}
但计算需要很长时间。有什么建议可以缩短处理时间吗? 谢谢。
答案 0 :(得分:1)
不要使用getReal2D。这很慢。
将图像转换为cv :: Mat或Mat。使用其数据指针获取像素值。 Mat.data()将为您提供指向原始矩阵的指针。用那个。
就排序而言,我建议你首先制作一个包含所有像素的数组,然后使用合并排序(时间复杂度O(n log n))对其进行排序
#include<opencv2/highgui/highgui.hpp>
#include<stdio.h>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("filename.jpg",CV_LOAD_IMAGE_COLOR);
unsigned char *input = (unsigned char*)(img.data);
int i,j,r,g,b;
for(int i = 0;i < img.cols;i++){
for(int j = 0;j < img.rows;j++){
b = input[img.cols * j + i] ;
g = input[img.cols * j+ i + 1];
r = input[img.cols *j + i +2];
}
}
return 0;
}
使用此功能,您可以访问主矩阵中的像素值。
警告:这不是您比较它的方式。我建议通过使用类似的东西,你可以访问像素值。
Mat.data()为您提供指向原始矩阵的指针。该矩阵是具有所有给定像素值的1D矩阵。
Image =&gt; (x,y,z),(x1,y1,z1)等。
Mat(原始矩阵)=&gt; X,Y,Z,X1,Y1,Z1,...
如果您对如何从Mat中提取数据仍有疑问,请访问此链接OpenCV get pixel channel value from Mat image
这是一个关于合并排序http://www.cplusplus.happycodings.com/Algorithms/code17.html
的链接答案 1 :(得分:1)
您的代码中存在一些问题:
cvGetReal2D
实际上不是很快。您必须将cvMat
转换为cv::Mat
。要做到这一点,有cv::Mat constructor:// converts old-style CvMat to the new matrix; the data is not copied by default Mat(const CvMat* m, bool copyData=false);
在此之后使用this SO question中提到的直接像素访问。
push_back
实际上也不是很快。你知道数组的大小,为什么不在开始时分配所需的内存?像这样: vector<int> vect_sortPixel(mat.cols*mat.rows);
而不仅仅是使用vect_sortPixel[i]
来获取所需的像素。
sort
?你必须在循环之后调用它,当数组已经创建时!默认STL's sort应该可以快速运行:复杂性
平均大约N * logN比较(其中N是 最后一)。在最坏的情况下,最多N ^ 2,具体取决于具体情况 库实现使用的排序算法。