当前位置:  开发笔记 > 编程语言 > 正文

是否有一个公式来确定给定BGR值的整体颜色?(OpenCV和C++)

如何解决《是否有一个公式来确定给定BGR值的整体颜色?(OpenCV和C++)》经验,为你挑选了2个好方法。

我正在使用C++和OpenCV创建一个函数,它将检测图像中像素的颜色,确定它所在的颜色范围,并用通用颜色替换它.例如,绿色可以从深绿色到浅绿色,程序将确定它仍然是绿色并用简单的绿色替换它,使输出图像看起来非常简单.一切都已设置,但我无法定义每个范围的特征,如果有人知道或者一个公式,给定BGR值,可以确定像素的整体颜色,这很奇怪.如果不是,我将不得不做很多实验,并自己做,但如果已经存在的东西,节省时间.我做了大量的研究,到目前为止还没有找到任何东西.



1> Miki..:

如果你想让你的图像更简单(即颜色更少),但看起来很好看,你有几个选择:

一种简单的方法是将(整数除法)除以N图像的因子,然后乘以一个因子N.

或者,您可以K使用某些聚类算法(例如kmeans此处显示的聚合算法)或中值切割算法将图像划分为颜色.

原始图片:

在此输入图像描述

减少颜色(量化N = 64):

在此输入图像描述

减少颜色(聚集K = 8):

在此输入图像描述

代码量化:

#include 
using namespace std;
using namespace cv;

int main()
{
    Mat3b img = imread("path_to_image");

    imshow("Original", img);

    uchar N = 64;
    img  /= N;
    img  *= N;

    imshow("Reduced", img);
    waitKey();

    return 0;
}

代码kmeans:

#include 
using namespace std;
using namespace cv;

int main()
{
    Mat3b img = imread("path_to_image");

    imshow("Original", img);

    // Cluster

    int K = 8;
    int n = img.rows * img.cols;
    Mat data = img.reshape(1, n);
    data.convertTo(data, CV_32F);

    vector labels;
    Mat1f colors;
    kmeans(data, K, labels, cv::TermCriteria(), 1, cv::KMEANS_PP_CENTERS, colors);

    for (int i = 0; i < n; ++i)
    {
        data.at(i, 0) = colors(labels[i], 0);
        data.at(i, 1) = colors(labels[i], 1);
        data.at(i, 2) = colors(labels[i], 2);
    }

    Mat reduced = data.reshape(3, img.rows);
    reduced.convertTo(reduced, CV_8U);


    imshow("Reduced", reduced);
    waitKey();

    return 0;
}



2> 小智..:

是的,“像素的整体颜色”可能指的是颜色的“色调”或“饱和度”。

因此,您需要一个将RGB转换为HSV(色调,饱和度,值)的公式,然后您只对色相或饱和度值感兴趣。

请参阅:将RGB转换为HSV和将HSV转换为RGB的算法,两者均在0-255范围内

编辑:您可能需要最大化饱和度,然后将其转换回RGB,并检查哪个值最高(例如(255,0,0)或(255,0,255)等)。

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有