C++ 如何改进cvMat中的像素排序?
我试图将图像(例如80x20)的像素值从最低到最高排序 以下是一些代码: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++) {
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
您能为
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);