灰值转换和图像抖动

灰值转换

这里通过6种计算得到不同的灰阶图像。

( r + g + b ) / 3 (r+g+b)/3 (r+g+b)/3

平均三色通道之和

0.3 ∗ r + 0.59 ∗ g + 0.11 ∗ b 0.3*r+0.59*g+0.11*b 0.3r+0.59g+0.11b

敏感的绿光在三者最大
相比红色和绿色,人们更能察觉明亮的绿色,为了显示真实的明度,这样表示各通道的区别。

( m a x ( r , g , b ) + m i n ( r , g , b ) ) / 2 (max(r,g,b)+min(r,g,b))/2 (max(r,g,b)+min(r,g,b))/2

平均两极通道

m a x ( r , g , b ) max(r,g,b) max(r,g,b)

保留最亮通道

m i n ( r , g , b ) min(r,g,b) min(r,g,b)

保留最暗通道

r o u n d ( ( r + g + b ) / 3 / 255 ) ∗ 255 round((r+g+b)/3/255)*255 round((r+g+b)/3/255)255

二阶黑白

图像抖动

加入抖动让点的密度接近原图的灰度,画面的扁平突兀增加了细节之后会变得更重更有质感。

Floyd–Steinberg dithering

抖动二阶黑白
r o u n d ( ( r + g + b ) / 3 / 255 ) ∗ 255 round((r+g+b)/3/255)*255 round((r+g+b)/3/255)255计算的二阶黑白图像抖动之后出现了更多细节。

同理这里以JavaScript关键代码演示Floyd–Steinberg dithering算法来实现彩色图像抖动。

for(var i=0;i<imagedata.data.length/4;++i)
{
   var oldred,oldgreen,oldblue,newred,newgreen,newblue,dividen,factor,imagewidth=720;
   oldred=imagedata.data[i*4];
   oldgreen=imagedata.data[i*4+1];
   oldblue=imagedata.data[i*4+2];
   dividen=2;
   factor=255/(dividen-1);
   newred=Math.round(oldred/factor)*factor;
   newgreen=Math.round(oldgreen/factor)*factor;
   newblue=Math.round(oldblue/factor)*factor;
   imagedata.data[i*4]=newred;
   imagedata.data[i*4+1]=newgreen;
   imagedata.data[i*4+2]=newblue;
   quanterrr=oldred-newred;
   quanterrg=oldgreen-newgreen;
   quanterrb=oldblue-newblue;

   imagedata.data[i*4+4]=imagedata.data[i*4+4]+((i+1)%imagewidth!=0)*quanterrr*7/16;
   imagedata.data[i*4+5]=imagedata.data[i*4+5]+((i+1)%imagewidth!=0)*quanterrg*7/16;
   imagedata.data[i*4+6]=imagedata.data[i*4+6]+((i+1)%imagewidth!=0)*quanterrb*7/16;

   imagedata.data[(i+imagewidth-1)*4]=imagedata.data[(i+imagewidth-1)*4]+quanterrr*3/16;
   imagedata.data[(i+imagewidth-1)*4+1]=imagedata.data[(i+imagewidth-1)*4+1]+quanterrg*3/16;
   imagedata.data[(i+imagewidth-1)*4+2]=imagedata.data[(i+imagewidth-1)*4+2]+quanterrb*3/16;

   imagedata.data[(i+imagewidth)*4]=imagedata.data[(i+imagewidth)*4]+quanterrr*5/16;
   imagedata.data[(i+imagewidth)*4+1]=imagedata.data[(i+imagewidth)*4+1]+quanterrg*5/16;
   imagedata.data[(i+imagewidth)*4+2]=imagedata.data[(i+imagewidth)*4+2]+quanterrb*5/16;

   imagedata.data[(i+imagewidth+1)*4]=imagedata.data[(i+imagewidth+1)*4]+((i+1)%imagewidth!=0)*quanterrr*1/16;
   imagedata.data[(i+imagewidth)*4+1]=imagedata.data[(i+imagewidth)*4+1]+((i+1)%imagewidth!=0)*quanterrg*1/16;
   imagedata.data[(i+imagewidth)*4+2]=imagedata.data[(i+imagewidth)*4+2]+((i+1)%imagewidth!=0)*quanterrb*1/16;
}

八色图
抖动八色图
这里称一次抖动为一次采样,当前像素被采样之后所产生的量化误差转移给未被采样的临近的四个像素,如果当前像素向下取整,临近的像素向上取整的概率就更大,平均下来量化误差接近0。

如果给一张50%灰度图,红黄蓝三通道值都为127或者都为128,用Floyd–Steinberg dithering算法抖动之后会呈现出黑白棋盘的模样。

算法《https://wswmsword.github.io/2019/05/17/A-floyd-steinberg-dithering/》
参见

Seven grayscale conversion algorithms (with pseudocode and VB6 source code)
YUV
A little more detail about Histograms
Dither
抖动 (数字信号处理)
Floyd–Steinberg dithering
噪点插画的六种绘制方法
Coding Challenge #90: Floyd-Steinberg Dithering

原图原图

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值