我正在Android上开发一个项目,这要求我最多可以过滤5种不同的颜色 - 包括背景颜色(近似白色).我不能使用高级数学算法,因为我不太了解数学(我会完全迷失),但是我使用了一些简单的逻辑算法,这些算法部分是通过反复试验得出的,部分是逻辑的,我已经能够结果可以说是70%.但我需要有关如何使其100%工作的建议.
为了测试算法,我在普通白(第5色)纸上用4种不同颜色的笔潦草地写下随机字/字母,然后写了一些代码来解码颜色.所以在代码中算法......
黑色墨水像素设置为数字黄色(非黑色,因为黑色很难在视觉上与墨水黑色区分).
我的代码如下,但首先是我的最佳结果之一.如您所见,黑色(用数字黄色表示)和红色(用数字红色表示)之间的边缘有重叠.就像我说我的代码是部分逻辑部分试错.
我的第一个问题是如何改进这个算法,以便完美地解码/过滤颜色(我之所以选择这种方法是因为我很快就会因为非常复杂的数学而迷路)?
其次,我怎样才能使它适用于不同的光线(白光,黄光......)?
编辑:经过进一步的评论和讨论,我意识到我需要的帮助是调色板颜色量化Adroid java代码示例,谢谢


if( (Blue > Green) &&(Red > Blue) && (Red - Green) > 25 )
copyOfBM.setPixel(x, y, Color.RED); //red
else if( (Blue > Red) && ( (Blue > Green)) )
copyOfBM.setPixel(x, y, Color.BLUE);
else if( (Green >= 82) && ((Green - Blue) >= 12) &&
((DecodeLuminaceColor( x, y, copyOfBM )>= 82 ) &&
(DecodeLuminaceColor( x, y, copyOfBM )< 124)) )
copyOfBM.setPixel(x, y, Color.GREEN);
else if( ((Red - …Run Code Online (Sandbox Code Playgroud) 我想知道如何在opencv c ++中绘制HSV Mat的二维直方图.我当前试图显示它的代码失败了.我已经四处查看如何绘制直方图,我发现的所有直方图都是将它们绘制为独立的1d直方图.
这是我当前的输出,色调分箱数为30,饱和分箱数为32:

这是另一个输出,其中色调分箱数为7,饱和分箱数为5:

我希望它看起来更像是这里的结果
我也注意到每当我做cout << Hist.size它给我50x50.我理解这只是意味着数组的第一个维度是250的大小?
另外,如何将直方图从最高到最低(或反之亦然)值频率排序?这是我想要解决的另一个问题.
我目前的功能如下.
void Perform_Hist(Mat& MeanShift, Mat& Pyramid_Result, Mat& BackProj){
Mat HSV, Hist;
int histSize[] = {hbins, sbins};
int channels[] = {0, 1};
float hranges[] = {0, 180};
float sranges[] = {0, 256};
const float* ranges[] = {hranges, sranges};
cvtColor(MeanShift, HSV, CV_BGR2HSV);
Mat PyrGray = Pyramid_Result.clone();
calcHist(&HSV, 1, channels, Mat(), Hist, 2, histSize, ranges, true, false);
normalize(Hist, Hist, 0, 255, NORM_MINMAX, -1, Mat());
invert(Hist, Hist, 1);
calcBackProject(&PyrGray, 1, channels, Hist, …Run Code Online (Sandbox Code Playgroud)