辛德勒的名单照片滤镜C++
Schindler's List Photo Filter C++
我正在尝试弄清楚如何为.bmp文件制作辛德勒列表(电影)风格的照片过滤器。对于那些没有看过它的人,我希望能够使除红色以外的所有内容都灰度。
这是针对一个类的,我只被允许使用以下库:iostream,fstream,cstdlib,string,cstring。
老师很好,给了我们大部分代码,我只需要相应地修改像素。
我的灰度算法并不完美。我通过使用fotor的灰度滤镜并比较RGB之前和之后的值得到了它。 当我运行此功能时,即使图片的颜色在我声明的范围内,整个图像也会变成灰度。
如果有人能帮我完成这项工作,那就太好了!
void process( int& red, int& green, int& blue ) //schindler's list filter
{
if( red < 143 && red > 80 &&
green < 64 && green > 24 &&
blue < 70 && blue >> 30 )//my red range
{
red = red;
blue = blue;
green = green;
}
else //if the pixel isnt red the program will go ahead and make it grayscale
{
red = ((red + green) / 2)*1.01;
green = red;
blue = red;
}
}
blue >> 30
愚蠢的错别字:你的意思是blue > 30
.
blue >> 30
基本上总是为零,这会转换为false
这使得您的"保持颜色原样"块无法访问。
如果有人能帮我完成这项工作,那就太好了!
我们真的不是来这里。下次请做一些调试。
删除条件,输出表达式和变量的值,直到找到不是预期值的值。制作一个测试用例。抽象出你的特定用例(即电影的名称与问题无关)。
顺便说一句,就风格而言,red = red
等完全没有意义!
正如评论员所说,在经典的RGB色彩空间中,灰度值是用公式计算
的grey = .2126*red + .7152*green + .0722*blue;
此外,如果您只是在要保留的颜色和灰色区域之间进行残酷的过渡,则看起来彩色区域已被绘制在图片上。
我宁愿根据您想要突出的颜色应用平滑。
// this is the center of the intervals you defined for your color
#define TARGET_R 111
#define TARGET_G 44
#define TARGET_B 50
// color distance to consider to mix grey and pure color
#define RADIUS 20 // R, G or B component
int dr = red - TARGET_R;
int dg = green - TARGET_G;
int db = blue - TARGET_B;
int dist = sqrt(dr*dr+dg*dg+db*db); // distance from target color
int grey = .2126*red+.7152*green+.0722*blue; // grey color
float color; // fraction of pure color
if (dist > RADIUS) // pure grey beyond radius
color = 0;
else if (dist > RADIUS/2) // slope from 0 @ radius to 1 @ radius/2
color = (RADIUS-dist)*2.0/RADIUS;
else // pure color between 0 and radius/2;
color = 1;
grey *= (1-color); // grey part
red = red * color + grey;
green = green * color + grey;
blue = blue * color + grey;
您可以采取的另一种方法是将RGB颜色转换为HSV(色相饱和度值)颜色空间,而不是仅在色调不在特定范围内时才降低饱和度。例如:
if( 30 < h && h < 330 ) s = 0
http://en.wikipedia.org/wiki/HSL_and_HSV
相关文章:
- C++中戈朗式延视镜防护性能
- 在python docker镜像上安装simstring(SWIG)
- (C++)(Visual Studio) 将高斯模糊滤镜应用于 RGB 中的灰度图像
- 将移动设备(iOS和Android)连接到带有QT / C++和镜像显示的VNC服务器
- 使用来自串行端口的字符串数据来操作振镜扫描仪在更高的速度下会出错
- 将迭代器从原始容器镜像到其副本
- 更快的图像镜像算法
- C++;镜像并从 std::basic_istream<> 中穿过?
- VTK-如何翻转镜像
- 仅使用位操纵来获得镜像的六角形
- 在C 中的数组中滤除重复值
- 我是否可以使用 openCV C++从带有红外滤光片的相机捕获的图像中计算 NDVI
- 为什么我的 iFFT 图像带有镜像副本
- 使用SCANF滤除负数
- 从std :: vector中滤出元素的有效方法
- 在此镜像代码中,可以是什么样的矩阵转换
- 辛德勒的名单照片滤镜C++
- 函数来创建镜像c++
- 模糊滤镜的 OpenCV 边框模式问题
- 复古,Lomo, Vignette滤镜在C/ c++