当前位置: 首页 > 知识库问答 >
问题:

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

常子濯
2023-03-14

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

共有1个答案

岳均
2023-03-14

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

>

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

    或者,您可以使用某些聚类算法(如这里所示的kmeans或中值切割算法)将图像划分为k颜色。

    原始图像:

    减少的颜色(量化,n=64):

    减少的颜色(群集,k=8):

    #include <opencv2/opencv.hpp>
    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;
    }
    
    #include <opencv2/opencv.hpp>
    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<int> labels;
        Mat1f colors;
        kmeans(data, K, labels, cv::TermCriteria(), 1, cv::KMEANS_PP_CENTERS, colors);
    
        for (int i = 0; i < n; ++i)
        {
            data.at<float>(i, 0) = colors(labels[i], 0);
            data.at<float>(i, 1) = colors(labels[i], 1);
            data.at<float>(i, 2) = colors(labels[i], 2);
        }
    
        Mat reduced = data.reshape(3, img.rows);
        reduced.convertTo(reduced, CV_8U);
    
    
        imshow("Reduced", reduced);
        waitKey();
    
        return 0;
    }
    

  •  类似资料:
    • 我在找一个算法(或者其他什么方法)来确定一个给定的加权图在O(ElogV)中是否有唯一的MST(最小生成树)? 我对体重一无所知(如体重(e1)!= weight(e2)),如果该图只有一个唯一的MST,则算法返回True,否则返回False。 我首先使用 Kruskal 的算法,并检查 find-set(u)==find-set(v) 是否因此在 MST 中有一个圆圈,但这种方式并没有涵盖我认为

    • 问题内容: 我在Python中使用matplotlib在一个数组中,其浮点数介于0到1之间。 我正在用imshow显示此数组,我试图创建一个与Greens相同的自定义cmap,但是当一个单元格变为0时,我希望能够将该值映射为红色,而其余光谱不变。 如果有人更熟悉matplotlib能够帮助我,我将不胜感激! 例如,我将如何编辑此脚本,以使矩阵中的零值显示为红色? 问题答案: matplotlib中

    • 问题内容: 雇员表具有ID和NAME列。名称可以重复。我想找出是否至少有一个名称类似“ kaushik%”的行。 因此查询应返回true / false或1/0。 是否可以使用单个查询找到它。如果我们尝试类似 在这种情况下,它不会返回true / false。另外,我们正在遍历表中的所有记录。简单SQL中是否存在这样的方式,使得每当获取满足条件的第一条记录时,它都应停止检查其他记录。还是只能在Pl

    • 通常,投影矩阵P的定义是将点从世界坐标投影到图像/像素坐标的3x4矩阵。投影矩阵可分为: K:具有本征参数的3x4摄像机矩阵K T:具有外参数的4x4变换矩阵 null

    • 汤姆教他的学生求一个数的阶乘。他想测试学生的理解力。为此,他提供了一个数字。他希望学生们告诉他这个数是哪个数的阶乘。 示例:如果Tom提供的数字为120,学生应该回答为5,因为5!=120。 通过编写一个程序来帮助学生做到这一点。请注意,输入应该是一个大于零的数字。如果输入小于或等于零,则输出应该是“无效输入”。此外,如果提供的输入不完全是一个数字的阶乘,例如,提供的输入是122,这不是一个数字的

    • 我正在寻找以下问题的答案。 给定一组整数(无重复项)和一个和,找出集合元素的所有可能组合,并求和。解的顺序并不重要(解{2,2,3}和{3,2,2}是相等的)。 请注意,最终组合不需要是集合,因为它可以包含重复。 示例:集合{2,3,5}和10 结果:{2, 2, 2, 2, 2},{2,2,3,3},{2,3,5},{5,5} 我已经研究过子集和问题以及硬币兑换问题,但不能使它们适应我的需要。我