在 OpenCV 中选择强度最高的像素
谁能帮我找出 opencv 中灰色图像中前 1%(或者说前 100 个像素)最亮的像素及其位置。因为 cvMinMaxLoc() 只给出最亮的像素位置。
非常感谢任何帮助。
Can anyone help me to find out the top 1% (or say top 100 pixels)brightest pixels with their locations of a gray image in opencv. because cvMinMaxLoc() gives only brightest pixel location.
Any help is greatly appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这是一种简单但无效/愚蠢的方法:
如果您不介意效率,那么这应该可行。
您还应该检查 cvInRangeS 以查找定义低阈值和高阈值的类似值的其他像素。
this is a simple yet unneficient/stupid way to do it:
if you don't mind about efficiency this should work.
you should also check cvInRangeS to find other pixels of similar values defining low and high thresholds.
您需要根据直方图计算亮度阈值。然后迭代像素以获得足够亮以满足阈值的位置。下面的程序将阈值应用于图像并显示结果以进行演示:
You need to calculate the brightness threshold from the histogram. Then you iterate through the pixels to get those positions that are bright enough to satisfy the threshold. The program below instead applies the threshold to the image and displays the result for demonstration purposes:
C++ 版本基于发布的一些其他想法:
使用示例:获取前 1%
C++ version based upon some of the other ideas posted:
Usage example: get top 1%
尝试使用 cvThreshold 代替。
Try using cvThreshold instead.
最合乎逻辑的方法是迭代整个图片,然后获取像素的 max 和 min 值。
然后选择一个阈值,该阈值将为您提供所需的百分比(在您的情况下为 1%)。
之后再次迭代并保存高于给定阈值的每个像素的
i
和j
坐标。这样,您只需迭代矩阵两次,而不是 100 次(或 1% 的像素次),然后选择最亮的并将其删除。
OpenCV 垫是多维数组。灰度图像是二维数组,其值从0到255。
您可以像这样迭代矩阵。
<代码>
for(int i=0;i < mat.height();i++)
for(int j=0;j < mat.width();j++)
垫[i][j];
Well the most logical way is to iterate the whole picture, then get the
max
andmin
value of the pixels.Then chose a threshold which will give you the desired percent(1% in your case).
After that iterate again and save the
i
andj
coordinates of each pixel above the given threshold.This way you'll iterate the matrix only two times instead of 100(or 1% of the pixels times) and choosing the brightest and deleting it.
OpenCV mats are multidimensional arrays. Gray image is two dimensional array with values from 0 to 255.
You can iterate trough the matrix like this.
for(int i=0;i < mat.height();i++)
for(int j=0;j < mat.width();j++)
mat[i][j];