- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一张图片:
并且图像中的颜色范围通过这些 RGB 值作为线性插值生成:
rgb = [165,0,38], w = 0.0
rgb = [222,63,46], w = 0.125
rgb = [248,142,82], w = 0.25
rgb = [253,212,129], ...
rgb = [254,254,189]
rgb = [203,232,129]
rgb = [132,202,102]
rgb = [42,159,84]
rgb = [0,104,55], w = 1.0
最佳答案
这是我将如何解决此问题的蛮力尝试。请注意,我正在寻找 RGB 空间中的颜色距离,但众所周知,RGB 中的颜色距离并不能很好地模拟人类对颜色的感知......但这是让你开始的东西。请注意,您需要 numpy
和 matplotlib
安装。 matplotlib
是允许将直方图绘制为茎图。
基本上,您定义的那些 RGB 值我们可以认为是 关键点 .从这里开始,我们需要定义直方图中需要计算的 bin 总数。我将其设置为 64 开始。您首先需要做的是为您定义的那些值插入红色、绿色和蓝色值,以便我们可以创建一个 RGB 查找表。因此,我们需要使用您定义的那些关键点生成从开始 RGB 元组到结束 RGB 元组的 64 个 RGB 值,我们将对这些 RGB 值进行线性插值。
此 RGB 查找表将是一个 64 x 3 数组,基本算法是从图像中提取 RGB 像素并确定 最近的像素从这个像素到查找表。我们找到产生最小距离的这个索引,我们将增加直方图中相应的 bin。我通过欧几里得距离的平方来计算。取平方根来获得欧几里得距离是没有意义的,因为我们想要找到最小距离。每个术语的平方根不会改变哪个像素颜色最接近查找表中的哪个条目。我们将对图像中的其余像素重复此操作。
要计算最小距离,请使用 numpy.sum
以及通过 broadcasting 减去查找表中每个位置在输入图像中获得的每个像素.我们对每个距离求平方,将它们相加,然后在查找表中确定为我们提供最小值的位置 numpy.argmin
.
现在,为了创建插值 RGB 查找,我调用了 numpy.interp
在红色、绿色和蓝色 channel 关键点上,输出 ( y
) 值来自您定义的红色、绿色和蓝色值的关键点值,输入 ( x
) 值是 假人 输入值从 0 线性增加到我们减去 1 的控制点。所以我们的输入 x
关键点是:
[0, 1, 2, 3, ..., N-1]
N
是关键点的总数,输出关键点分别是红色、绿色和蓝色的关键点值。为了创建 64 个值的查找,我们需要在
0
之间创建 64 个点。至
N-1
,我们可以通过
numpy.linspace
来实现.
float32
这样我们就可以在计算距离时保持精度。另外,一旦我计算出直方图,因为你想要
百分比 ,我将直方图转换为百分比,方法是除以直方图中的值总数(即图像中的像素数),然后乘以 100% 以得到百分比。
wheat.png
,但将其重命名为您的图像名称:
import numpy as np # Import relevant libraries
import cv2
import matplotlib.pyplot as plt
# Read in image
img = cv2.imread('wheat.png')
# Flip the channels as the image is in BGR and cast to float
img = img[:,:,::-1].astype('float32')
# control points for RGB - defined by you
rgb_lookup = np.array([[165,0,38], [222,63,46], [248,142,82],
[253,212,129], [254,254,189], [203,232,129],
[132,202,102], [42,159,84], [0,104,55]])
# Define number of bins for histogram
num_bins = 64
# Define dummy x keypoint values
x_keypt = np.arange(rgb_lookup.shape[0])
# Define interpolating x values
xp = np.linspace(x_keypt[0], x_keypt[-1], num_bins)
# Define lookup tables for red, green and blue
red_lookup = np.interp(xp, x_keypt, rgb_lookup[:,0])
green_lookup = np.interp(xp, x_keypt, rgb_lookup[:,1])
blue_lookup = np.interp(xp, x_keypt, rgb_lookup[:,2])
# Define final RGB lookup
rgb_final_lookup = np.column_stack([red_lookup, green_lookup, blue_lookup])
# Brute force
# For each pixel we have in our image, find the closest RGB distance
# from this pixel to each pixel in our lookup. Find the argmin,
# then log into histogram accordingly
hist = np.zeros(num_bins)
# Get the rows and columns of the image
rows = img.shape[0]
cols = img.shape[1]
# For each pixel
for i in np.arange(rows):
for j in np.arange(cols):
# Get colour pixel value
val = img[i,j,:]
# Find closest distance to lookup
dists = np.sum((rgb_final_lookup - val)**2.0, axis=1)
# Get location for histogram
ind = np.argmin(dists)
# Increment histogram
hist[ind] += 1
# Get percentage calculation
hist = 100*hist / (rows*cols)
# Plot histogram
plt.stem(np.arange(num_bins), hist)
plt.title('Histogram of colours')
plt.xlabel('Bin number')
plt.ylabel('Percentage')
plt.show()
关于python - 如何在 OpenCV 中创建自定义调色板的颜色直方图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28994420/
我正在尝试从我的系统中完全删除 opencv。我试图学习 ROS,而在教程中我遇到了一个问题。创建空工作区后,我调用catkin_make 它给出了一个常见错误,我在 answers.ros 中搜索并
我在尝试逐步转移对warpAffine的调用时遇到崩溃(不是异常): void rotateImage( const Mat& source, double degree, Mat& output )
如何处理opencv gpu异常?是否有用于opencvgpu异常处理的特定错误代码集api? 我尝试了很多搜索,但只有1个错误代码,即CV_GpuNotSupported。 请帮帮我。 最佳答案 虽
笔记 我是 OpenCV(或计算机视觉)的新手,所以告诉我搜索查询会很有帮助! 我想问什么 我想编写一个从图片中提取名片的程序。 我能够提取粗略的轮廓,但反射光会变成噪点,我无法提取准确的轮廓。请告诉
我想根据像素的某个阈值将Mono16类型的Mat转换为二进制图像。我尝试使用以下内容: 阈值(img,ret,0.1,1,CV_THRESH_BINARY); 尝试编译时,出现make错误,提示: 错
我对使用GPU加速的OpenCV中的卷积函数有疑问。 使用GPU的卷积速度大约快3.5 运行时: convolve(src_32F, kernel, cresult, false, cbuffer);
我正在尝试使用非对称圆圈网格执行相机校准。 我通常找不到适合CirclesGridFinder的文档,尤其是findHoles()函数的文档。 如果您有关于此功能如何工作以及其参数含义的信息,将不胜感
在计算机上绘图和在 OpenCV 的投影仪上投影之间有什么区别吗? 一种选择是投影显示所有内容的计算机屏幕。但也许也有这样的选择,即在投影仪上精确地绘制和投影图像,仅使用计算机作为计算机器。如果我能做
我将Processing(processing.org)用于需要人脸跟踪的项目。现在的问题是由于for循环,程序将耗尽内存。我想停止循环或至少解决内存不足的问题。这是代码。 import hyperm
我有下面的代码: // Image Processing.cpp : Defines the entry point for the console application. // //Save
我正在为某些项目使用opencv。并有应解决的任务。 任务很简单。我有一张主图片,并且有一个模板,而不是将主图片与模板进行比较。我使用matchTemplate()函数。我只是好奇一下。 在文档中,我
我正在尝试使用以下命令创建级联分类器: haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20 -n
我试图使用OpenCV检测黑色图像中一组形状的颜色,为此我使用了Canny检测。但是,颜色输出总是返回为黑色。 std::vector > Asteroids::DetectPoints(const
我正在尝试使用OpenCv 2.4.5从边缘查找渐变方向,但是我在使用cvSobel()时遇到问题,以下是错误消息和我的代码。我在某处读到它可能是由于浮点(??)之间的转换,但我不知道如何解决它。有帮
我正在尝试构建循环关闭算法,但是在开始开发之前,我想测试哪种功能描述符在真实数据集上效果更好。 我有两个在两个方向拍摄的走廊图像,一个进入房间,另一个离开同一个房间。因此它们代表相同的场景,但具有2个
有没有一种方法可以比较直方图,但例如要排除白色,因此白色不会影响比较。 最佳答案 白色像素有 饱和度 , S = 0 .因此,在创建直方图时很容易从计数中删除白色像素。请执行下列操作: 从 BGR 转
就像本主题的标题一样,如何在OpenCV中确定图像的特定像素(灰度或彩色)是否饱和(例如,亮度过高)? 先感谢您。 最佳答案 根据定义,饱和像素是指与强度(即灰度值或颜色分量之一)等于255相关联的像
我是OpenCV的新用户,正在从事大学项目。程序会获取输入图像,对其进行综合模糊处理,然后对其进行模糊处理。当对合成模糊图像进行反卷积时,会生成边界伪像,因为...好吧,到目前为止,我还没有实现边界条
我想知道OpenCV是haar特征还是lbp是在多尺度搜索过程中缩放图像还是像论文中提到的那样缩放特征本身? 编辑:事实证明,检测器可以缩放图像,而不是功能。有人知道为什么吗?通过缩放功能可以更快。
我在openCv中使用SVM.train命令(已定义了适当的参数)。接下来,我要使用我的算法进行分类,而不是使用svm.predict。 可能吗?我可以访问训练时生成的支持 vector 吗?如果是这
我是一名优秀的程序员,十分优秀!