使用FSharp 探索Dotnet图像处理功能2--均衡灰度
重新捡起大学里的图像处理,好像之前什么都没学到,但是我为什么还留着这本书呢?嘿嘿。
看到均衡灰度处理,上来就是积分,概率分布的公式,头微微的有点疼。网上看了点介绍,隔天再拿起书本,总算有了点眉目。简而言之,就是将灰度直方图的概率分布进行面积不变的拉伸,使图像有更好的显示效果。
其实进行的操作也很少
1.计算灰度值的出现概率。
2.将灰度值进行排序,并累进递加。
3.将累进递加的值映射到0-255的范围中。这时就有了一个原灰度与新灰度的一个对应关系。公式是 Y = (int)(C * p + 0.5) C为目标灰度最大值 p为累进概率。
4.再将原图的每个灰度替换为目标灰度
代码如下
//the number of pixels
let length = (bitmap.Width * bitmap.Height * Bitmap.GetPixelFormatSize(bitmap.PixelFormat)/) let rArray = [|for i in .. -> 0uy|] buffer
|> Seq.groupBy id |> Seq.map (fun x -> (fst x), double (Seq.length (snd x))/ double length)// step 1
|> Seq.sortBy fst //step 2
|> Seq.scan (fun (_, op) (k,p)-> (k, p + op)) (0uy, 0.0) //step 2
|> Seq.map (fun (k, p) -> (int k, (byte)(255.0 * p + 0.5))) //step 3
|> Seq.iter (fun (k, p) -> rArray.[k] <- p) //step 3 let newbuff = buffer |> Seq.map(fun x -> rArray.[int x]) |> Array.ofSeq //step 4
其中groupBy得到的是key和分组列表值。所以之后用了fst和snd。
scan用来计算递增值真是简单啊。
是不是清楚很多。
rArray 感觉有点别扭,可以再做一点优化
let rArray =
buffer
|> Seq.groupBy id |> Seq.map (fun x -> (fst x), double (Seq.length (snd x))/ double length)
|> Seq.append [255uy, 0.0]
|> Seq.sortBy id
|> Seq.pairwise
|> Seq.map (fun (b,e) ->
[for i in fst b..fst e-1uy do
if i = fst b then
yield b
else
yield (i, 0.0)])
|> Seq.collect id
|> Seq.scan (fun op (k, p) -> (p + op)) (0.0)
|> Seq.map (fun p -> (byte)(255.0 * p + 0.5))
|> Seq.toArray
使用FSharp 探索Dotnet图像处理功能2--均衡灰度的更多相关文章
- 使用FSharp 探索Dotnet图像处理功能1--反色变化
坚持写博客是最近的目标.加油. 业余学习fsharp以来一直觉得这才是Dotnet开发,或者说所有开发者应该拥有的语言.配合Visual Studio的代码提示,即时执行窗口.开发程序有着极大的乐趣. ...
- 使用Fsharp 探索 Dotnet 平台
Fsharp的交互开发环境使得我们在了解DotNet平台时能够快速的获得需要的反馈. 反馈在任何技艺的磨练过程中必不可少,我认为也是最重要的环节之一.在“一万小时天才理论”中,著名的髓鞘质就是在快速有 ...
- php图像处理(thinkphp框架有相对强大的图像处理功能)
php图像处理(thinkphp框架有相对强大的图像处理功能) 一.总结 1.php处理图像:php处理图像需要安装外库(gd库) 2.gd库函数可以非常完美的操作图像:安装好库之后,这个库里面的函数 ...
- Java 从零开始实现一个画图板、以及图像处理功能,代码可复现
Java 从零开始实现一个画图板.以及图像处理功能,代码可复现 这是一个学习分享博客,带你从零开始实现一个画图板.图像处理的小项目,为了降低阅读难度,本博客将画图板的一步步迭代优化过程展示给读者,篇幅 ...
- Win8MetroC#数字图像处理--2.1图像灰度化
原文:Win8MetroC#数字图像处理--2.1图像灰度化 [函数说明] 图像灰度化函数GrayProcess(WriteableBitmap src) [算法说明] 图像灰度化就是去掉彩色 ...
- 博客主题皮肤探索-添加新功能和fiddler的css/js替换
还有前言 使用了主题之后,发现还差了一点功能.最新评论没有了,导致读者回复需要一点时间去找到底回复了哪条博客.于是就有了添加功能的想法. 如何调试CSS/JS 打开f12,可以看见加载的js资源都是混 ...
- HLSL实现简单的图像处理功能
由于对于dxva2解码得到的数据不宜copy回内存给CPU处理,所以最好的办法是在GPU上直接进行处理.D3D的像素着色器能够对像素直接进行操作,实现点运算极其简单方便,简单的卷积运算效果也非常好.但 ...
- 探索 dotnet core 为何在 Windows7 系统需要补丁的原因
在一些 Windows 7 系统上,根据 dotnet 官方文档,需要安装上 KB2533623 补丁,才能运行 dotnet core 或 .NET 5 等应用.尽管非所有的设备都需要安装此,但这也 ...
- 探索Django验证码功能的实现 - DjangoStarter项目模板里的封装
前言 依然是最近在做的这个项目,用Django做后端,App上提交信息的时候需要一个验证码来防止用户乱提交,正好我的「DjangoStarter」项目脚手架也有封装了验证码功能,不过我发现好像里面只是 ...
随机推荐
- 单线程JavaScript
最近在阅读<你不知道的JavaScript中卷>,当我看到第二部分介绍异步和回调函数的一些知识时,由于该书在第二部分1.2章对线程.事件循环的概念介绍的并非详细,因此引发了我的一系列思考. ...
- 随手小记(es6)
在学习前辈阮一峰大神写的<ECMAScript入门>一书的过程中,第九章中讲到对象扩展时,第一条我就有点看不懂 ES6允许直接写入变量和函数,作为对象的属性和方法.这样的书写更加简洁. v ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简介
很久之前就打算开始写一下自己的技术博客了,实在抽不出时间所以计划一直搁置了,最近项目进度渐渐缓了下来,不那么忙了,也因此开始筹备自己的博客.说到这次博客的主角,也是无心插柳找到的,来源于两年前自己写的 ...
- LOGISTIC回归分析
前面的博客有介绍过对连续的变量进行线性回归分析,从而达到对因变量的预测或者解释作用.那么如果因变量是离散变量呢?在做行为预测的时候通常只有"做"与"不做的区别" ...
- 面向对象重写(override)与重载(overload)区别 (转)
一.重写(override) override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法. 重写(覆盖)的规则: 1.重写方法的参数列表必须完 ...
- MYSQL中添加时间
1.在创建新记录和修改现有记录的时候都对这个数据列刷新:TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 2.在创建新记录 ...
- 对spring,struts,hibernate及MVC的理解
对于spring,hibernate,struts等框架,刚开始的时候总是会很迷茫,不知道他们是用来做什么的. 1.对框架的作用理解 个人认为框架的作用是把代码进行了分类,减少了代码的耦合性. 如果不 ...
- Asp.net缓存技术(HttpRuntime.Cache)
一.缓存: 5个等级的缓存 1级是网络级缓存,缓存在浏览器,CDN以及代理服务器中 (举个例子:每个帮助页面都进行了缓存,访问一个页面的代码非常简单) 2级是由.net框架 HttpRuntime ...
- Phpcms 详情页显示所属栏目的同级栏目
Phpcms详情页是不显示所属栏目的同级栏目的,如果按下面的方式 {loop subcat($parentid) $v} <li{if $v[catid]==$catid} class=&quo ...
- 基于vue的多引擎搜索及关键字提示
关键代码: <div class="header-search"> <form id="form" action="http://m ...