【发布时间】:2014-05-01 08:32:19
【问题描述】:
我想这是一个很简单的问题(我来自 Java),但我不知道它是如何工作的。
我只想将向量元素加一。这样做的原因是,我想根据图像值计算直方图。但是无论我尝试什么,我都可以完成为向量分配一个值。但不要加一!
这是我的直方图函数:
void histogram(unsigned char** image, int height,
int width, vector<unsigned char>& histogramArray) {
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
// histogramArray[1] = (int)histogramArray[1] + (int)1;
// add histogram position by one if greylevel occured
histogramArray[(int)image[i][j]]++;
}
}
// display output
for (int i = 0; i < 256; i++) {
cout << "Position: " << i << endl;
cout << "Histogram Value: " << (int)histogramArray[i] << endl;
}
}
但是无论我尝试在 histogramArray 位置添加 1,它都会导致输出中只有 0。我只能分配具体的值,例如:
histogramArray[1] = 2;
有没有简单易行的方法?我虽然希望在这一点上不需要迭代器,因为我知道我想要增加某些东西的 exakt 索引位置。
编辑: 很抱歉,我的问题应该更准确,谢谢你到目前为止的帮助!上面的代码可以正常工作,但它显示的直方图中的平均值(差异约为 90)与应有的不同。直方图的值也与图形程序中的不同——即使图像值完全相同!这就是为什么我研究了该函数并发现如果我将直方图设置为零然后尝试增加一个元素,没有任何反应!这是上面的注释代码:
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
histogramArray[1]++;
// add histogram position by one if greylevel occured
// histogramArray[(int)image[i][j]]++;
}
}
所以位置 1 保持为 0,而不是值 height*width。正因为如此,我认为正确的计算 histogramArray[image[i][j]]++;也不能正常工作。
你对此有什么解释吗?这是我的主要问题,对不起。
为了完整起见,这是我的直方图平均函数:
unsigned char meanHistogram(vector<unsigned char>& histogram) {
int allOccurences = 0;
int allValues = 0;
for (int i = 0; i < 256; i++) {
allOccurences += histogram[i] * i;
allValues += histogram[i];
}
return (allOccurences / (float) allValues) + 0.5f;
}
我像这样初始化图像:
unsigned char** image= new unsigned char*[width];
for (int i = 0; i < width; i++) {
image[i] = new unsigned char[height];
}
但是初始化代码应该没有任何问题,因为所有其他计算都可以完美运行,并且我能够操纵和保护原始图像。但这是真的,我应该改变宽度和高度——因为我只有方形图像,到目前为止这并不重要。 直方图是这样创建的,然后函数是这样调用的:
vector<unsigned char> histogramArray(256);
histogram(array, adaptedHeight, adaptedWidth, histogramArray);
那么你知道为什么这部分是 histogramArray[1]++;不要增加我的直方图? histogramArray[1] 一直保持为 0!直方图数组[1] = 2;工作正常。还有 histogramArray[(int)image[i][j]]++;似乎计算了一些东西,但正如我所说,我认为它计算错误。 我非常感谢任何帮助!我使用二维数组的原因仅仅是因为它被要求。我也更喜欢 1D 版本,因为它更简单!
【问题讨论】:
-
问题在于您的数组索引...
image[i][j]不起作用,因为您需要一个指向字符的指针...它应该如何知道数组当它们不在类型中时的尺寸?您可能希望将unsigned char*然后索引(一次)传递给image[i * width + j],但这取决于i和j中的哪一个在您的数据布局中变化最快。在 C++ 中,编写一个多维数组类是很常见的,它允许例如image(i,j)表示法来访问您认为是[i][j]的元素。 -
我会添加一行
std::cout << image[i][j] << std::endl;以确保您访问的是histogramArray的正确元素。另外,您是否确定histogramArray具有所需的元素?您希望在histogramArray中看到多少项目?如果您事先不知道histogramArray的大小,map可能是合适的。 -
您发布的代码没有任何问题(您有多余的演员表,但它们不会造成问题)。我怀疑调用
histogram()函数的代码中存在问题,您能否证明这一点(包括您传入的参数的全部设置)。 -
正如@TonyD 所写,问题出在您的
image上。您需要在分配图像的位置发布代码。它从何而来?您是否确实为每个图像分配了height+1内存? (这可能是这段代码有意义的唯一方法。)你的其余代码都很好;唯一的问题是您分配和索引图像的方式。 -
正如马特所说,应该没有什么问题。我可以将我的图像用于其他计算并正确修改它并正确打印图像。很抱歉我的问题如此不精确。部分 histogramArray[(int)image[i][j]]++;正在数东西。但我很确定这是错的。因为我的图像值是正确的,但我的输出直方图与图形程序直方图不同。我想如果我尝试 histogramArray[1]++;位置 [1] 仍然为 0!它没有增加。
标签: c++ vector histogram vision