PS 图像黑白调整算法(彩色图转灰度图)(VC++)

news/2024/11/24 2:23:01/

本篇文章参考了万水千山的博客PS 图像调整算法——黑白和阿发伯的博客C++图像处理 -- 图像颜色混合(上)


黑白调整

Photoshop CS的图像黑白调整功能,是通过对红、黄、绿、青、蓝和洋红等6种颜色的比例调节来完成的。能更精细地将彩色图片转换为高质量的黑白照片。

    Photoshop CS图像黑白调整功能的计算公式为:

    gray= (max - mid) * ratio_max + (mid - min) * ratio_max_mid + min

    公式中:gray为像素灰度值,max、mid和min分别为图像像素R、G、B分量颜色的最大值、中间值和最小值,ratio_max为max所代表的分量颜色(单色)比率,ratio_max_mid则为max与mid两种分量颜色所形成的复色比率。

默认的单色及复色比率为:

Color_Ratio(1)=0.4;     %%%% Red

Color_Ratio(2)=0.6;     %%%% Yellow

Color_Ratio(3)=0.4;     %%%% Green

Color_Ratio(4)=0.6;     %%%% Cyan

Color_Ratio(5)=0.2;     %%%% Blue

Color_Ratio(6)=0.8;     %%%% Magenta


下面是实现代码:

BOOL Convert24toGrayPS(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{unsigned char *lpSrc;LONG lLineBytes = WIDTHBYTES(lWidth * 24);unsigned char  buf;unsigned char* lpRed;unsigned char* lpGreen;unsigned char* lpBlue;float Color_Ratio[6];int Index;//PS中各颜色的默认比例//BGR分别为蓝色,绿色和红色,其中蓝色和绿色的中间色为青色,//红色和绿色的中间色为黄色,红色和蓝色的中间色为紫(洋红)色。Color_Ratio[0] = 0.4;  //红色RedColor_Ratio[1] = 0.6;  //黄色Yellow	Color_Ratio[2] = 0.4;  //绿色GreenColor_Ratio[3] = 0.6;  //青色CyanColor_Ratio[4] = 0.2;  //蓝色BlueColor_Ratio[5] = 0.8;  //紫(洋红)色Magentafor (int i = 0; i < lHeight; i++){for (int j = 0; j < lWidth * 3; j += 3){lpRed = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j + 2;//顺序为BGRlpGreen = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j + 1;lpBlue = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;int SumRGB = (*lpRed) + (*lpGreen) + (*lpBlue);int MaxValue = max((*lpRed), max((*lpGreen), (*lpBlue)));int MinValue = min((*lpRed), min((*lpGreen), (*lpBlue)));int MidValue = SumRGB - MaxValue - MinValue;if (MinValue == (*lpRed)){Index = 3;}else if (MinValue == (*lpGreen)){Index = 5;}else{Index = 1;}float ratio_max_mid = Color_Ratio[Index];if (MaxValue == (*lpRed)){Index = 0;}else if (MaxValue == (*lpGreen)){Index = 2;}else{Index = 4;}float ratio_max = Color_Ratio[Index];buf = (MaxValue - MidValue)*ratio_max + (MidValue - MinValue)*ratio_max_mid + MinValue;*lpRed = *lpGreen = *lpBlue = buf;}}return TRUE;
}

经过亲自试验,发现这个算法确实比(0.299R+ 0.587G+ 0.114B)的这个效果要好一些,但是本人还读过Imageshop的一篇关于实现灰度图的算法对比度保留之彩色图像去色算法---基础算法也可以上档次,在这篇文章中灰度图完好的保留了对比度,效果更真实一些(尽管通过PS的黑白调整,调整各个参数也可以达到保留对比度的效果,但是那样操作起来太复杂了),不过本人暂时懒得去学习,先记录在这里吧,还有一个问题就是,使用PS的算法生成的灰度图会比较暗,不知道是自己程序的原因还是别的原因还是这个算法本来就是这样的。(这个经过u010120739的评论发现自己把数据类型都定义错了,应该定义为float型)

int ratio_max_mid = Color_Ratio[Index];
int Color_Ratio[6];
int ratio_max = Color_Ratio[Index];
改为

float ratio_max_mid = Color_Ratio[Index];
float Color_Ratio[6];
float ratio_max = Color_Ratio[Index];

下面贴出效果图,从左到右分别是原图,(0.299R+ 0.587G+ 0.114B)效果图,PS算法效果图,Imageshop博文算法效果图:





http://www.ppmy.cn/news/466183.html

相关文章

计算机ps工具字母,PS如何制作m字母教程

2 回答 回答&#xff1a; 方法步骤如下&#xff1a; 1、首先打开计算机&#xff0c;在计算机内打开Ps&#xff0c;在Ps界面内导出一堆图片&#xff0c;在Ps中的打开命令中选择第一张图片&#xff0c;然后勾选上图像序列点击打开&#xff0c;这样所有的图片就会按照顺序在Ps中打…

matlab 二值图像黑白颠倒,白天不懂夜的黑,为你开启PS黑白颠倒魔法。

最终效果&#xff1a; 原图&#xff1a; 当原图有以下特点时&#xff0c;效果更好&#xff1a;图像没有曝光过度&#xff0c;在天空和前景之间有明显的分界线&#xff0c;一条直射过来的光源 具体步骤&#xff1a; 一、添加一个“色相/饱和度”调整图层。单击带有左右箭头的小手…

unity Shader模拟ps渐变映射效果

美术要求程序实现一个类似photo中“渐变映射”的效果。 记录一下用unity完成的shader。 放一张路易斯 那么渐变映射的原理是什么&#xff1f;以下是百度的结果&#xff1a; 在使用时&#xff0c;渐变映射首先会将照片去色变成黑白&#xff0c;然后从明度的角度分为&#xff1…

PS

一&#xff1a;基础 1、快捷键 左右移动&#xff1a;Alt鼠标滚轴 上下移动&#xff1a;Shift鼠标滚轴 放大缩小&#xff1a;Alt鼠标滚轴&#xff08;shiftAlt鼠标滚轴&#xff1a;增加速度&#xff09; 打开文件&#xff1a;CtrlO CtrlS&#xff1a;存储 CtrlShiftS&#xf…

ps2022 - ps to dxf

ps2022 - ps to dxf 概述 需要将ps工程转为dxf给allegro用. 前面已经做了一个ps工程(ps2022 - add text), 在图片上写了字 这个笔记, 记录将ps工程转为dxf的过程. 用的是adobe全家桶, 不使用第三方的转换软件. 实验 打开ps工程 右边图层中, 红框内的2个字体图层, 是主画布…

ps技巧:从黑白图片中创建蒙版

step1: 选中黑白图的图层 step2&#xff1a; 点击通道&#xff0c;按住CTRL&#xff0c;点击任意通道&#xff0c;这样你就得到一个选区 step3&#xff1a; 返回到图层选项卡&#xff0c;点击创建蒙版&#xff0c;ok

2023年NPDP产品经理认证线上班,到这里

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…