c# - 如何使用 Emgu c# 去饱和图像
问题描述
我知道我们通过降低饱和度通道中的值来降低图像的饱和度。我想用c#和emgu来完成这个
例如,这里是使用opencv执行此操作的c++代码:
Mat Image = imread("images/any.jpg");
// Specify scaling factor
float saturationScale = 0.01;
Mat hsvImage;
// Convert to HSV color space
cv::cvtColor(Image,hsvImage,COLOR_BGR2HSV);
// Convert to float32
hsvImage.convertTo(hsvImage,CV_32F);
vector<Mat>channels(3);
// Split the channels
split(hsvImage,channels);
// Multiply S channel by scaling factor
channels[1] = channels[1] * saturationScale;
// Clipping operation performed to limit pixel values
// between 0 and 255
min(channels[1],255,channels[1]);
max(channels[1],0,channels[1]);
// Merge the channels
merge(channels,hsvImage);
// Convert back from float32
hsvImage.convertTo(hsvImage,CV_8UC3);
Mat imSat;
// Convert to BGR color space
cv::cvtColor(hsvImage,imSat,COLOR_HSV2BGR);
// Display the images
Mat combined;
cv::hconcat(Image, imSat, combined);
namedWindow("Original Image -- Desaturated Image", CV_WINDOW_AUTOSIZE);
在 c# 中,我有:
var img = new Image<Gray, byte>("images/any.jpg");
var imhHsv = img.Convert<Hsv, byte>();
var channels = imhHsv.Split();
// Multiply S channel by scaling factor and clip (limit)
channels[1] = (channels[1] * saturationScale);
imHsv
如果我这样做,我不确定如何将修改后的饱和度通道与 合并:
CvInvoke.Merge(channels, imhHsv);
有错误:
无法将“Emgu.CV.Image[]”转换为“Emgu.CV.IInputArrayOfArrays”
解决方案
我把一个VectorOfMat
放进去CvInvoke.Merge
,它就可以了。
Mat[] m = new Mat[3];
m[0] = CvInvoke.CvArrToMat(channels[0]);
m[1] = CvInvoke.CvArrToMat(channels[1]);
m[2] = CvInvoke.CvArrToMat(channels[2]);
VectorOfMat vm = new VectorOfMat(m);
CvInvoke.Merge(vm, imhHsv);
推荐阅读
- apache - 无法使用端口 8443 打开 https 站点
- apache-flink - 当下游之一挂起时,如何继续从非并行源广播?
- javascript - 使 3D 书籍具有响应性
- c++ - 检测编译时文字和常量
- f# - F# Map.add 时间和空间复杂度
- javascript - 如何删除特定消息?
- dart - Flutter 错误 - 断言失败:第 213 行 pos 15:'data != null':在从 firestore 获取数据时不正确
- python - Chrome 被自动化测试软件“不安全”数据控制:Python
- jquery - 'jquery-rails' 和 'jquery-ui-rails' 可以在一个项目下管理吗?
- javascript - JQuery 表格排序器插件未在 IE 11 中显示表格数据