You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过OpenCV的HSV直方图获取图像中占比最高的颜色(C++)

Hey there! Let's walk through how to figure out the dominant color from your H-S histogram, plus a C++ implementation using OpenCV 2.4.

How to Interpret the H-S Histogram for Dominant Color

Your H-S histogram is a 2D grid where each cell at coordinates (H_bin, S_bin) represents the number of pixels in the image with that specific hue (H) and saturation (S) combination. To find the dominant color:

  • Locate the cell in the histogram with the highest value — this cell corresponds to the most frequent H-S pair in your image.
  • Convert the bin indices back to actual H and S values (since bins are grouped ranges). For OpenCV's 8-bit HSV format:
    • Hue ranges from 0-179 (maps to 0-360 degrees in standard color theory)
    • Saturation ranges from 0-255 (0 = grayscale, 255 = fully saturated color)
  • Pair this H-S combination with a full-value (255) brightness (V) to get the most vivid version of that color, then convert it back to RGB if needed.
C++ Implementation with OpenCV 2.4

Here's a complete, commented example to calculate the dominant color using an H-S histogram:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // Load your input image — replace with your image path
    Mat img = imread("your_image.jpg");
    if (img.empty()) {
        cerr << "Failed to load the image!" << endl;
        return -1;
    }

    // Convert image from BGR (OpenCV's default) to HSV color space
    Mat hsv_img;
    cvtColor(img, hsv_img, COLOR_BGR2HSV);

    // Define histogram parameters
    int h_bin_count = 16; // Number of bins for Hue — adjust for precision/smoothing
    int s_bin_count = 16; // Number of bins for Saturation
    int hist_dim_sizes[] = {h_bin_count, s_bin_count};

    // Set value ranges for H and S channels
    float h_range[] = {0, 180};
    float s_range[] = {0, 256};
    const float* channel_ranges[] = {h_range, s_range};

    // Specify which channels to use (H=0, S=1)
    int channels_to_use[] = {0, 1};

    // Calculate the 2D H-S histogram
    Mat hist;
    calcHist(&hsv_img, 1, channels_to_use, Mat(), hist, 2, hist_dim_sizes, channel_ranges, true, false);

    // Optional: Blur the histogram to reduce noise interference
    GaussianBlur(hist, hist, Size(3, 3), 0);

    // Find the maximum value in the histogram and its coordinates
    double max_pixel_count;
    Point max_bin_location;
    minMaxLoc(hist, nullptr, &max_pixel_count, nullptr, &max_bin_location);

    // Convert bin indices back to actual H and S values
    float dominant_hue = max_bin_location.x * (180.0f / h_bin_count);
    float dominant_saturation = max_bin_location.y * (256.0f / s_bin_count);

    // Create an HSV color with full brightness (V=255) and convert to BGR
    Scalar dominant_hsv(dominant_hue, dominant_saturation, 255);
    Mat temp_rgb(1, 1, CV_8UC3);
    temp_rgb.at<Vec3b>(0, 0) = Vec3b(dominant_hsv[0], dominant_hsv[1], dominant_hsv[2]);
    cvtColor(temp_rgb, temp_rgb, COLOR_HSV2BGR);

    Vec3b dominant_bgr = temp_rgb.at<Vec3b>(0, 0);
    cout << "Dominant Color (BGR): " << (int)dominant_bgr[0] << ", " << (int)dominant_bgr[1] << ", " << (int)dominant_bgr[2] << endl;
    cout << "Corresponding HSV Values: " << dominant_hue << ", " << dominant_saturation << ", 255" << endl;

    // Optional: Display a solid color block showing the dominant color
    Mat color_preview(200, 200, CV_8UC3, dominant_bgr);
    imshow("Dominant Color Preview", color_preview);
    waitKey(0);

    return 0;
}

Key Notes

  • Adjust bin counts: More bins mean higher color precision but can pick up noise; fewer bins give a smoother, more generalized dominant color.
  • Why V=255?: The H-S histogram only tracks hue and saturation — using full brightness gives the most vivid representation of the dominant color.
  • Histogram blurring: This step helps ignore small, noisy pixel clusters that might otherwise be mistaken for the dominant color.

内容的提问来源于stack exchange,提问作者Satinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:11:07