辛德勒的名单照片滤镜C++

Schindler's List Photo Filter C++

本文关键字:C++ 滤镜 照片 辛德勒的名单      更新时间:2023-10-16

我正在尝试弄清楚如何为.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