gpt4 book ai didi

c# - Open CV saturate_cast 函数的 Emgu CV 等价物是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:42 34 4
gpt4 key购买 nike

问题

什么相当于saturate_castemgucv

背景

我有一个 Image<Bgr, byte>我想对其中的每个像素执行一个简单的计算(顺便说一句:alpha * val + beta,其中传入了alphabeta)。在 C++ 中执行此操作我可以这样做:

cv::Mat new_image = cv::Mat::zeros(image.size(), image.type());
for (int y = 0; y < image.rows; y++)
{
for (int x = 0; x < image.cols; x++)
{
for (int c = 0; c < 3; c++)
{
new_image.at<cv::Vec3b>(y,x)[c] = cv::saturate_cast<uchar>(
alpha * (image.at<cv::Vec3b>(y,x)[c]) + beta);
}
}
}

在 Emgu CV 中做同样事情的一个非常缓慢的方法是这样的:

var newImage = image.CopyBlank();
for (int y = 0; y < image.Rows; y++)
{
for (int x = 0; x < image.Cols; x++)
{
MCvScalar orig = image[y, x].MCvScalar;
var v0 = alpha * orig.v0 + beta;
var v1 = alpha * orig.v1 + beta;
var v2 = alpha * orig.v2 + beta;
var v3 = alpha * orig.v3 + beta;
var newCol = new Bgr();
newCol.MCvScalar = new MCvScalar(v0, v1, v2, v3);
newImage[y, x] = newCol;
}
}

但正如我所说,那太慢了(太慢了),所以我 read那一个应该使用 Data属性(property),所以我可以做这样的事情:

var data = image.Data;
var newImage = image.CopyBlank();
for (int y = 0; y < image.Rows; y++)
{
for (int x = 0; x < image.Cols; x++)
{
for (int c = 0; c < 3; c++)
{
var b = data[y, x, c];
double ret = alpha * b + beta;

// Eek, now I need to saturate_cast...
newImage.Data[y, x, c] = (byte)ret;
}
}
}

但这并没有做正确的事情,因为我只是在转换 doublebyte并且不执行 saturate_cast .

我也可以使用 Convert通用方法,我比较喜欢,但问题是一样的——我有一个 byte ,我将我的计算应用于它并得到一个 double但我需要回到byte .

最佳答案

我最终编写了自己的方法,因为我认为 emgu cv 中没有任何预先封装的内容。 .

基于 saturate_cast 的文档,我认为(因为它与我尝试过的图像产生相同的结果)相当于 saturate_castc# 中是:

private static byte SaturateCast(double value)
{
var rounded = Math.Round(value, 0);

if (rounded < byte.MinValue)
{
return byte.MinValue;
}

if (rounded > byte.MaxValue)
{
return byte.MaxValue;
}

return (byte)rounded;
}

所以在我的例子中我可以这样做,我认为这非常优雅(并且比我原来的方法快很多):

var newImage = image.Convert(b => SaturateCast(alpha * b + beta));

关于c# - Open CV saturate_cast 函数的 Emgu CV 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14458054/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com