C++ 如何将图像转换为灰度级opengl c++;

C++ 如何将图像转换为灰度级opengl c++;,c++,opengl,grayscale,C++,Opengl,Grayscale,任何人都知道如何转换为灰度,下面是一些我需要使用的骨架代码。具体来说,将“之前”转换为灰度, 应用Sobel边缘检测卷积滤波器,并存储 结果是“之后”。之前必须为非空 template <typename color_depth> void edge_detect(gfx::image<color_depth>& after, const gfx::image<color_depth>& before) { // Check argum

任何人都知道如何转换为灰度,下面是一些我需要使用的骨架代码。具体来说,将“之前”转换为灰度, 应用Sobel边缘检测卷积滤波器,并存储 结果是“之后”。之前必须为非空

template <typename color_depth> void 
edge_detect(gfx::image<color_depth>& after,
const gfx::image<color_depth>& before) {

  // Check arguments.
  assert(!before.empty());

  // TODO: replace this function body with working code. Make sure
  // to delete this comment.

  // Hint: Use the grayscale(...) and extend_edges(...) filters to
  // prepare for the Sobel convolution. Then compute the Sobel
  // operator one pixel at a time. Finally use crop_extended_edges
  // to un-do the earlier extend_edges.

}
模板无效
边缘检测(gfx::图像和之后,
常量gfx::图像和之前){
//检查参数。
断言(!before.empty());
//TODO:用工作代码替换此函数体。请确保
//删除此评论。
//提示:使用灰度(…)和扩展_边(…)过滤器
//准备索贝尔卷积,然后计算索贝尔卷积
//操作符一次一个像素。最后使用裁剪扩展边
//要取消执行早期的“延伸”边,请执行以下操作。
}

这看起来是一个家庭作业问题,所以我不会给出完整的实现。我也不知道您是想在CPU上还是在着色器中转换为灰度。无论在何处执行转换,公式都是相同的

没有确定的方法来转换为灰度,因为您正在丢弃信息,最终结果是否正确完全是主观的。以下是从RGB转换为灰度的一些常用方法:

一个简单的方法是找到具有最高值的颜色通道,然后使用它

grey = max(colour.r, max(colour.g, colour.b));
如果图像的某些区域不包含任何具有最高值的颜色,则会完全丢失细节,这种天真的方法会受到影响。为了防止这种情况,我们可以使用所有颜色成分的简单平均值

grey = (colour.r + colour.g + colour.b) / 3.0;
“更好”的方法是使用值。人眼对某些颜色波长的感知能力比其他颜色波长强。因此,如果我们给这些颜色更多的权重,我们就会产生一个更合理的灰度

grey = dot_product(colour, vec3(0.299, 0.587, 0.114));

另一种方法是“去饱和”图像。这需要首先将RGB颜色空间转换为。然后将饱和度降至零。

这看起来是一个家庭作业问题,因此我不会给出完整的实现。我也不知道您是想在CPU上还是在着色器中转换为灰度。无论在何处执行转换,公式都是相同的

没有确定的方法来转换为灰度,因为您正在丢弃信息,最终结果是否正确完全是主观的。以下是从RGB转换为灰度的一些常用方法:

一个简单的方法是找到具有最高值的颜色通道,然后使用它

grey = max(colour.r, max(colour.g, colour.b));
如果图像的某些区域不包含任何具有最高值的颜色,则会完全丢失细节,这种天真的方法会受到影响。为了防止这种情况,我们可以使用所有颜色成分的简单平均值

grey = (colour.r + colour.g + colour.b) / 3.0;
“更好”的方法是使用值。人眼对某些颜色波长的感知能力比其他颜色波长强。因此,如果我们给这些颜色更多的权重,我们就会产生一个更合理的灰度

grey = dot_product(colour, vec3(0.299, 0.587, 0.114));
另一种方法是“去饱和”图像。这需要首先将RGB颜色空间转换为。然后将饱和度降至零