- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想做的是编写一个函数来计算灰度图像的直方图,其中转发的 Bins 数 (anzBin) 直方图范围被划分为。然后我运行图像像素以匹配它们将值分配给不同的 Bins,如果某个值适合,则将 Bin 的值增加 1
vector<int> calcuHisto(const IplImage *src_pic, int anzBin)
{
CvSize size = cvGetSize(src_pic);
int binSize = (size.width / 256)*anzBin;
vector<int> histogram(anzBin,0);
for (int y = 0; y<size.height; y++)
{
const uchar *src_pic_point =
(uchar *)(src_pic->imageData + y*src_pic->widthStep);
for (int x = 0; x<size.width; x++)
{
for (int z = 0; z < anzBin; z++)
{
if (src_pic_point[x] <= z*binSize)
{
histogram[src_pic_point[x]]++;
}
}
}
}
return histogram;
}
但不幸的是它不起作用......这里有什么问题?请帮忙
最佳答案
我能看到一些问题
<强>1。 binsize计算
bin size = your range / number of bins
<强>2。两侧合并
if (src_pic_point[x] <= z*binSize)
您需要一个双向的值范围,而不是一个单向的不平等。假设您有 4 个 bin 和从 0 到 255 的值。您的 bin 应具有以下范围
bin low high
0 0 63.75
1 63.75 127.5
2 127.5 191.25
3 191.25 255
例如:值为 57
应该进入 bin 0。您的代码表示该值进入所有 bin!因为它总是 <= z*binsize
你需要一些有下限和上限的东西。
<强>3。增加适当的 bin
您正在使用 z
遍历每个 bin,所以当你找到匹配项时,你应该增加 bin z
,除非确定它属于哪个 bin,否则不使用实际像素值
这很可能是缓冲区溢出再次假设您有 4 个 bin,并且当前像素的值为 57。此代码表示增量 bin 57。但是您只有 4 个 bin (0-3)
histogram[src_pic_point[x]]++;
你只想增加像素值落入的 bin
histogram[z]++;
代码
考虑到这一点,这里是修改后的代码(未经测试,但应该可以工作)
vector<int> calcuHisto(const IplImage *src_pic, int anzBin)
{
CvSize size = cvGetSize(src_pic);
double binSize = 256.0 / anzBin; //new definition
vector<int> histogram(anzBin,0); //i don't know if this works so I
//so I will leave it
//goes through all rows
for (int y = 0; y<size.height; y++)
{
//grabs an entire row of the imageData
const uchar *src_pic_point = (uchar *)(src_pic->imageData + y*src_pic->widthStep);
//goes through each column
for (int x = 0; x<size.width; x++)
{
//for each bin
for (int z = 0; z < anzBin; z++)
{
//check both upper and lower limits
if (src_pic_point[x] >= z*binSize && src_pic_point[x] < (z+1)*binSize)
{
//increment the index that contains the point
histogram[z]++;
}
}
}
}
return histogram;
}
关于c++ - 尝试在没有 opencv calcHist() 的情况下计算我自己的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36779920/
我有这样的事情: import numpy as np import cv2 as cv from matplotlib import pyplot as plt import numpy.polyn
我正在使用 calcHist 函数计算图像的颜色直方图。我正在开发一个简单的图像匹配应用程序,我正在尝试使用颜色直方图作为图像描述符来查找相似图像。 这是定义: void calcHist(const
尝试使用带掩码的 calcHist 时出现此错误:error: (-215) mask.size() == imsize && mask.channels() == 1 in function his
我正在努力学习equalization of histograms , 我当然知道有 histogram equalization in OpenCV .我是iterating over the Ma
我正在尝试使用 OpenCV 的 Emgu C# 包装器为图像的反向投影创建直方图。我有以下 OpenCV C++ 代码,我正在尝试将其转换为 Emgu C#: char* filename = (c
我有这段代码用于计算和绘制图像的直方图。 colors = ('b', 'g', 'r') for i, col in enumerate(colors): hist = cv2.calcHi
在尝试使用 cv2.calcHist() 时,我遇到了以下不明确的错误 >>> img array([ 1., 2., 3., 4., 5.]) >>> cv2.calcHist( [img]
我试图了解 cvCalcHist 之间的区别,openCV c 版本 和 calcHist 中计算图像直方图的方法>,openCV c++ version 中计算图像直方图的方法。 openCV c版
我试图从 OpenCV 中的彩色(3 channel )图像中获取直方图,但每次我都像这样执行 calcHist 直方图: //int histSize[3]; //float hranges[2];
我已经多次阅读 calcHist() 的文档,但我认为我对 OpenCV 的缺乏经验和生疏的编程技能完全使我无法理解它。 我正在计算 HSV 图像(Hue 或 channel [0])的一个 chan
我想做的是编写一个函数来计算灰度图像的直方图,其中转发的 Bins 数 (anzBin) 直方图范围被划分为。然后我运行图像像素以匹配它们将值分配给不同的 Bins,如果某个值适合,则将 Bin 的值
我正在尝试让一些 C++ 代码在我的 Android 设备上运行;但是,我遇到了 Mat 类型的一个小问题。我在用着。我尝试转换的代码如下(第二个函数调用第一个): static Mat histc_
我在“OpenCV 2 计算机视觉应用程序编程手册”一书第 4 章中运行一个示例。calcHist 返回的只有 2 个直方图是黑色的,并且遵循源代码。运行结果如下图。 ColorHistogram()
我正在使用上面的代码从灰度图像计算直方图;它工作正常。 cv::Mat imgSrc = cv::imread("Image.jpg", cv::IMREAD_UNCHANGED); cv::Mat
我正在尝试计算仅由一行组成的矩阵的直方图。我使用 OpenCV3.1 在 VS2015 中编写了这段代码: //Create matrix stromal pop cv::Mat stromalHis
我想计算图像的颜色直方图,但只考虑特定像素(我知道其二维坐标)。 是否可以使用 calcHist 指定仅应考虑这些具体像素(而不是整个 cv::Mat 和其中的所有像素)?如果没有,是否可以创建一个新
我是计算机视觉的新手,这是我的第一份作业。我正在尝试创建与文件夹中的每个图像相对应的 rgb 直方图。假设我在 test 文件夹(位于我当前的工作目录中)中有 10 张图片。我想为每个图像创建 10
我有计算 hsv 和 yuv 图像直方图的代码。由于我试图单独获取与亮度对应的值,因此我想要来自 hsv 图像的“v” channel 值和来自 yuv 图像的亮度(“y”) channel 值。这是
这里有很多关于 OpenCV 中的 calcHist 的问题,但我找不到我的问题的答案,并且已经多次阅读文档,所以希望有人可以通过以下代码发现我的问题: //the setup is that I'v
我正在尝试使用以下代码: cv::MatND hist; cv::Mat image = cv::imread("image.bmp"); float *range = new
我是一名优秀的程序员,十分优秀!