C++ 如何改进cvMat中的像素排序?

C++ 如何改进cvMat中的像素排序?,c++,sorting,opencv,C++,Sorting,Opencv,我试图将图像(例如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++) {

我试图将图像(例如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);
        }
    }
bool-sortpix(int-first,int-second)
{
返回(第一次<第二次);
}
vectorvect_sortPixel;

对于(inty=0;y不要使用getReal2D。它非常慢

将图像转换为cv::Mat或Mat。使用其数据指针获取像素值。Mat.data()将为您提供指向原始矩阵的指针。使用该指针

至于排序,我建议您首先创建一个包含所有像素的数组,然后使用合并排序(时间复杂度O(n logn))对其进行排序

#包括
#包括
使用名称空间cv;
使用名称空间std;
int main()
{
Mat img=imread(“filename.jpg”,CV\u LOAD\u IMAGE\u COLOR);
无符号字符*输入=(无符号字符*)(img.data);
int i,j,r,g,b;
for(int i=0;i
使用此选项,您可以从主矩阵访问像素值

警告:这不是比较它的方式。我建议通过使用类似的方法,您可以访问像素值。

Mat.data()为您提供指向原始矩阵的指针。该矩阵是具有所有给定像素值的一维矩阵

图像=>(x,y,z),(x1,y1,z1)等

Mat(原始矩阵)=>x,y,z,x1,y1,z1

如果您对如何从Mat中提取数据仍有疑问,请访问此链接


这里有一个关于合并排序的链接

您的代码中几乎没有问题:

  • 如前所述,您使用的是
    cvGetReal2D
    ,实际上速度不是很快。您必须将
    cvMat
    转换为
    cv::Mat
    。为此,需要:
在此之后,请使用中提到的直接像素访问

  • 另一个问题是,您使用的是
    push_back
    ,实际上也不是很快。您知道数组的大小,所以为什么不在开始时分配所需的内存呢?如下所示:
向量向量排序像素(mat.cols*mat.rows);

而不仅仅是使用
vect\u sortPixel[i]
来获得所需的像素

  • 为什么要在循环中调用
    sort
    ?当数组已经创建时,必须在循环后调用它!默认值应该可以快速工作:
复杂性

平均大约N*logN比较(其中N为 最坏情况下,根据具体情况,最多N^2 库实现使用的排序算法


您能为
sort()
方法添加代码吗?很抱歉,排序是从(algorithm.h)调用的。在OpenCV中使用
sort
函数怎么样?但它声明“如果您想按字典顺序对矩阵行或列进行排序,可以使用STL std::sort generic函数并进行适当的比较。”我该怎么做?你能给我举个例子吗?@Mizuki文章有一些伪代码。就我个人而言,我会使用基数或快速排序,因为它们通常更快,尽管它们的代码更复杂。除非你的图像非常大,否则合并排序应该可以。我在哪里可以找到Radiz或快速排序?它可用吗?谢谢你的帮助信息。这很有帮助。@MizukiKai STL中有
qsort
。只需谷歌一下。我已经告诉过你
sort
应该工作得很快。我告诉过你的所有步骤你都完成了吗?我100%肯定完成后你的算法会很快。那么你为什么要放弃你的消息呢?在编辑之前:
使用它的数据指针来获取pixel values.Mat.data()将为您提供指向原始矩阵的指针。请使用它。
这不是一个建议吗???感谢您提供的信息。我知道下一步该怎么做。这很有帮助。如何仅使用vect_sortPixel[I]获得像素?我需要先向后推,对吗?@MizukiKai不!我已经告诉过你,
push_back
是一个缓慢的操作。如果你知道数组的大小,在向量构造函数中分配所需的内存是有意义的。你知道单词
分配
构造函数
意味着什么吗?如果不知道,那么就读取。
#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;
}
// converts old-style CvMat to the new matrix; the data is not copied by default
Mat(const CvMat* m, bool copyData=false);