使用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」项目脚手架也有封装了验证码功能,不过我发现好像里面只是 ...
随机推荐
- java中读取特殊文件的类型
java中读取特殊文件的类型: 第一种方法(字符拼接读取): public static String getType(String s){ String s1=s.substring(s.index ...
- PrefixHeader.pch' file not found 以及 Xcode 中如何添加pch文件
在开发的过程中,有时候接触到旧项目,会报: 'PrefixHeader.pch' file not found 的错误! 在Xcode6之前,新建一个工程的时候,系统会帮我们自动新建一个以工程名为名字 ...
- console深入理解
["$$", "$x", "dir", "dirxml", "keys", "values ...
- WEB标准了解
今天看到朋友的简历有一项“了解WEB标准”,就特地了解了一下什么是WEB标准.现在就一项一项地解开自己的疑惑. 1.什么是WEB标准 WEB标准大部分由万维网组织(W3C)制定的WEB程序开发规范.W ...
- C#-MVC开发微信应用(1)--开始使用微信接口
1.微信账号 要开发使用微信的平台API,就需要到微信的公众平台(https://mp.weixin.qq.com/)去注册,拥有一个服务号或者订阅号,服务号主要面对企业和组织,订阅号主要面向组织和个 ...
- CSS3形变——transform与transform-origin画时钟
css3属性transform和transform-origin"画"时钟 效果图 前言 八哥:哈喽,大家好!好攻城狮就是我就是你们的小八,欢迎收听你的月亮...哦不,是很高兴与你 ...
- JAVA基础:自己构造一个按递增排列的数组,用户输入一个数,插入适当位置
- 在.NET项目中使用PostSharp,使用CacheManager实现多种缓存框架的处理
在前面几篇随笔中,介绍了PostSharp的使用,以及整合MemoryCache,<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>.<在.NET项目中使用Pos ...
- yaourt 之 Curl 错误
最近执行 yaourt 更新时总是出现以下错误: curl error: Couldn't connect to server 无法进行更新.把配置中的下载工具更换了成 axel 等其它下载工具,还是 ...
- TimeUnit枚举类
TimeUnit是 java.util.concurrent 中的一个枚举类.一般让线程进行睡眠时使用: TimeUnit.MILLISECONDS.sleep(100); 比如上面一行代码表示让当 ...