如何将图像转换为灰度 opengl c++
How to convert image to greyscale opengl c++
任何人都知道如何转换为灰度,下面是我需要使用的一些骨架代码。具体来说,将"之前"转换为灰度, 应用 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.
}
这看起来是一个家庭作业问题,所以我不会给出完整的实现。我也不知道你是要在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色彩空间转换为HSL。然后将饱和度降低到零。
相关文章:
- 在 C++ 中将 RGB 更改为灰度
- OpenCV - 如何在灰度图像上应用 Kmeans?
- OpenCV - 如何将灰度转换为彩色(CV_8UC3)?
- C++灰度图像处理
- 如何显示具有 opengl 纹理的灰度图像
- C++ Gdi+将图像转换为灰度
- 将 BMP 图像转换为灰度
- 如何使用Canny到32位灰度
- 颜色到灰度转换
- (C++)(Visual Studio) 将高斯模糊滤镜应用于 RGB 中的灰度图像
- 使用 SSE 以最快的速度缩小 8 位灰度图像
- 使用 OpenCV 和 C++将 16 位灰度图像更改为彩色图像
- 有没有办法使用 glDrawPixel 渲染单通道灰度图像?
- goodFeaturesToTrack() 只适用于灰度?
- 如何在OpenCV中减去两个不同尺寸的图像和灰度图像
- 使用 ImageMagick 从像素强度数组创建灰度图像时遇到问题
- 如何将图像转换为灰度 opengl c++
- OpenGL和GLSL:灰度纹理不显示
- Opengl Rgba从一个组件到灰度
- 将灰度OpenCV图像传递到OpenGL纹理