簡體   English   中英

BGR到HSV轉換中的意外量化

[英]Accidental quantization in BGR to HSV conversion

我正在嘗試將BGR圖像轉換為HSV。 當我寫出轉換的H通道時,它具有奇怪的塊狀結構,我猜這意味着在此過程中意外量化了某些內容。 我嘗試將我的BGR無符號字符圖像首先轉換為浮點數,但結果是相同的。 這是我的代碼:

// STL
#include <iostream>

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

void Float(const std::string& inputFilename)
{
    cv::Mat image = cv::imread(inputFilename, CV_LOAD_IMAGE_COLOR); // Loads as BGR

    cv::Mat floatImage;
    image.convertTo(floatImage, CV_32FC3);

    cv::Mat hsvImage;
    cv::cvtColor(floatImage, hsvImage, CV_BGR2HSV);

    std::vector<cv::Mat> hsvChannels;
    cv::split(hsvImage, hsvChannels);

    cv::imwrite("h_float.png", hsvChannels[0]);

}

void Original(const std::string& inputFilename)
{
    cv::Mat image = cv::imread(inputFilename, CV_LOAD_IMAGE_COLOR); // Loads as BGR

    cv::Mat hsvImage;
    cv::cvtColor(image, hsvImage, CV_BGR2HSV);

    std::vector<cv::Mat> hsvChannels;
    cv::split(hsvImage, hsvChannels);

    cv::imwrite("h_original.png", hsvChannels[0]);

}

int main(int argc, char* argv[])
{
    std::string inputFilename = argv[1];

    Original(inputFilename);
    Float(inputFilename);

    return EXIT_SUCCESS;
}

這是輸入: 在此處輸入圖片說明

和輸出(h_original.png): 在此處輸入圖片說明

和輸出(h_float.png): 在此處輸入圖片說明

關於我在這里做錯什么的任何建議?

您正在以正確的方式做所有事情。 我在計算機上嘗試了您的圖像,並得到了相同的結果。 我認為此結果是由於圖像的色彩范圍較低所致。 這是HSV 3通道的結果。 H和S遭受這個問題。 但是,V是平滑的,因為它與光照條件有關,而不與顏色有關。

H通道

S通道

V通道

編輯:

為了使我的觀點更清楚,請使用相同的代碼查看此圖像和輸出:

原始RGB

H通道

S通道

V通道

另一個編輯(黑色問題):

HSVif V=0 then it is black其余SH均為if V=0 then it is black 因此,要檢查顏色是否為黑色,您只需檢查V分量,而檢查其他分量則沒有意義。

數學證明:

C = V × S
X = C × (1 - |(H / 60º) mod 2 - 1|)
m = V - C

單純皰疹病毒

顯然,當V=0且無論H,S是多少時,我們將得到: C=0 , X=0導致R,G,B=(0,0,0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM