对于一些图像分割工作,我想在 HSL 颜色空间中使用图像的亮度通道。
为此,我将 RGBA 图像转换为 RGB,然后再转换为 HSL。在颜色转换之后,我使用 将图像分割成它的颜色平面cv::mixChannels
,这为我提供了饱和度/亮度平面的黑色输出。
代码:
cv::Mat src;
cv::Mat hsl;
cv::cvtColor(srcRgba , src , CV_RGBA2RGB);
cv::cvtColor(src, hsl, CV_RGB2HLS);
cv::Mat hue = cv::Mat::Mat(hsl.size(), hsl.depth());
cv::Mat saturation = cv::Mat::Mat(hsl.size(), hsl.depth());
cv::Mat lightness = cv::Mat::Mat(hsl.size(), hsl.depth());
cv::Mat matsOut[] = { hue, saturation, lightness };
// hsv[0] => hue[0], hsv[1] => saturation[0], hsv[2] => lightness[0]
int ch[] = { 0,0, 1,0, 2,0 };
// number of elements in hsl -> 1
// number of elements in matsOut -> 3
// number of pairs in ch -> 3
cv::mixChannels(&hsl, 1, matsOut, 3, ch, 3);
也许我搞砸了什么cv::mixChannels
?
编辑
这是cv::split
我使用的代码,Xcode 给了我错误:
代码:
cv::Mat src;
cv::Mat hsl;
cv::cvtColor(srcRgba , src , CV_RGBA2RGB);
cv::cvtColor(src, hsl, CV_RGB2HLS);
std::vector<cv::Mat> hslChannels;
cv::split(hsl, hslChannels);
错误:
Undefined symbols for architecture x86_64:
"cv::split(cv::Mat const&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&)", referenced from:
hsvTest(cv::Mat) in test.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
编辑 2
明白了,这行得通:
cv::Mat src;
cv::Mat hsl;
cv::cvtColor(srcRgba , src , CV_RGBA2RGB);
cv::cvtColor(src, hsl, CV_RGB2HLS);
cv::Mat hslChannels[3];
cv::split(hsl, hslChannels);
现在色调平面完全是黑色的,但饱和度和亮度平面看起来还不错……</p>