我认为将照片中包含的数据可视化是一项有趣的练习,就像其他数据集一样。一些相机和照片编辑软件就是这样做的,从图像中的红色(R),绿色(G)和蓝色(B)值(三个“原色”)构建直方图,以帮助专业摄影师/编辑判断和改善颜色平衡。为了说明这个想法,我将使用下面的彩色照片及其灰度对应物。

最简单的方法是从灰度图像开始,根据定义,R,G和B值对于任何给定像素都是相同的。在左边,我们有一个灰度值为0,意味着(R,G,B)值(0,0,0),又名黑色; 在右边它是(255,255,255)或白色。在我们之间我们有254种灰色阴影。

这是在图表中使用渐变实际上可以帮助澄清事物的少数情况之一,在这种情况下,通过根据它代表的灰度值对每个条形图着色。唯一的问题是选择一个中性的背景颜色:

对于彩色图像,我们需要分别绘制R,G和B直方图中的每一个。使用线条而不是条形线条那么杂乱,但是使用合理的配色方案它们可能不需要贴标签。

除了实现良好的色彩平衡之外,我认为还有另一个有趣的问题是对于Web开发很重要:压缩。JPEG压缩是一个相当复杂的主题,我承认我还没有真正理解它。上面的彩色照片是我拍摄的原始(800万像素)图像的高质量(低压缩)缩影。它的大小是46千字节。下面的图像在像素数方面是相同的,但压缩程度更高,质量更低。但是,它的大小只有9千字节。

照片本身的质量较低应该是明显的,但RGB直方图看起来有何不同?在尝试这个之前,我真的不知道会发生什么。虽然下面的直方图与上面的直方图明显不同,但他们并没有真正尖叫“这张图片的压缩程度远远超过另一张图片”。

这张照片是8bit的PNG版本。

这张图片看起来比低质量的JPEG好很多,但它也比它大六倍(文件大小),比高质量的JPEG大三分之一。直方图也非常不同并且难以阅读(还要注意垂直标度的差异)。

这种混乱的直方图是这样一个事实的结果:在8位PNG中只能使用256种不同的颜色(就像GIF一样)。

上面的直方图数据可以从Photoshop的(至少某些版本)中提取,并且可能是其他照片编辑软件。但是,在高质量和低质量JPEG的直方图之间没有发现任何重大差异,我很想知道RGB数据的更复杂表示是否会突出差异。这需要提取所有单独的RGB值,而不仅仅是不同通道的总和。我不知道如何在Photoshop中这样做,所以我用R(其他选项可用)。在理想的世界中,3D散点图可以很好地工作 - 每个R,G和B都有一个维度。但2D屏幕上的3D散点图很少有效。所以我选择了更传统的2D散点图,使用点颜色来显示第三种颜色。在下面的示例中,我(有点随意)选择将蓝色值与红色值进行对比,并根据绿色值对点进行着色。例如,表示RGB值为(30,96,92)的图像像素的数据点将被绘制在图表上的点(30,92)处并且具有RGB颜色(0,96,0)。

我这样做的最初尝试遭遇了一些严重的过度绘图问题。为了减少(尽管不是删除)这个问题,我将点数设置得更小,并为每个图像随机抽取了“仅”20,000点(不到20%的数据)。我还在图的未标记的末端添加了边缘分布(即相关的直方图)。这些来自所有图像像素,而不仅仅是样本。

现在我们可以看到高质量和低质量JPEG之间的差异:后者具有更明显的点和间隙的对角线带。在检查数据时,高质量JPEG的~105,000像素中有大约20,000个不同的RGB值,而低质量的JPEG只有15,000个。至于PNG图,这是过度绘图的一个极端例子。确实有20,000点绘制,它们只占据了几百个不同的位置。

最终,你可能会像网页设计师或开发人员一样度过生活,而不了解图像压缩的复杂性 - 我仍然不确定JPEG压缩实际上是如何工作的。但我认为有趣的是知道基础数据是用来构建自己的dataviz实验。

长按订阅更多精彩▼

从照片中可视化图像数据相关推荐

  1. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

  2. R语言中可视化图像的标题太长如何进行换行?

    R语言中可视化图像的标题太长如何进行换行? 目录 R语言中可视化图像的标题太长如何进行换行? R语言是解决什么问题的? R语言中可视化图像的标题太长如何进行换行? R语言是解决什么问题的? R 是一个 ...

  3. TensorFlow中读取图像数据的三种方式(转)

    附加一个链接关于DatasetAPI:https://zhuanlan.zhihu.com/p/30751039 本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和 ...

  4. ROS☞通过两种方法提取.bag中的图像数据

    以下两种环境均在Ubuntu16.04环境下测试成功. 第一种方法 ROS-从rosbag中提取图像(by launch文件) 1.新建launch文件(文件在哪无所谓,可以在catkin_ws的根目 ...

  5. opencv从内存缓冲区中读取图像数据

    1.从内存中加载图像数据 s_Image_Info stDispImgInfo = spImgInfo->m_stDispInfo; //cv::_InputArray pic_arr(stDi ...

  6. OpenCV中对图像数据进行64F和8U转换的方法

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 在OpenCV中很多对数据的运算都需要转换为64 ...

  7. HTML5 Canvas中创建图像数据

    创建图像数据 如果想预先生成一组空的canvas数据,则可调用context.createImageData(sw, sh),这个函数可以创建一组图像数据并绑定在canvas对象上.这组数据可以像先前 ...

  8. ITK入门教程(10)ITK从缓冲器中导入图像数据

    目录 1.概述 2.过程分析 3.代码样例 4.结果展示 1.概述 这个例子阐述了如何导入数据到itk::Image类中.这在和其它软件系统接口时非常有用.许多系统使用连续的内存块作为图像像素数据的缓 ...

  9. 让input支持 ctrl v上传粘贴图片? 让input支持QQ截图或剪切板中的图像数据(Java实现保存)...

    原理:监听粘贴 → 获取粘贴内容 → 将内容上传 → 抓取后返回替换至input 我们在生产中用到的界面: 测试地址 http://sms.reyo.cn 用户名:aa 密码:123456 以下是PH ...

最新文章

  1. Java中finalize方法用途何在?
  2. Java程序执行Linux命令调用EasyPR程序识别车牌号
  3. matlab dsp实验报告,matlab实验报告14.pdf
  4. OpenCV学习笔记之OpenCV安装
  5. 抚摸那条船——彭晓东
  6. NodeJS学习目录
  7. .net redis定时_一场由fork引发的超时,让我们重新探讨Redis的抖动问题
  8. 水仙花数,用scratch编程实现
  9. html鼠标滑动响应,CSS鼠标响应事件经过、移动、点击示例介绍
  10. 购买域名不得不注意的事项
  11. ERROR 1356 (HY000): View 'information_schema. SCHEMATA'
  12. yolov5的首次colab运行
  13. 真爱一个人,何妨赌一生
  14. arm mali 天梯图_2018最新CPU天梯图 2018年2月CPU性能天梯图最新版
  15. 用友漏洞php,Phpwind GET型CSRF任意代码执行漏洞公开
  16. 决策树——预测泰坦尼克号幸存者
  17. windows 安装python
  18. torch.manual_seed()及其作用
  19. linux命令格式和常用命令
  20. java实现Excel导出下载功能(返回pdf流)

热门文章

  1. Codeforces Round #645 (Div. 2)(D.The Best Vacation)
  2. 树状数组 ---- 树状数组+动态维护前缀中位数 D. Omkar and Medians
  3. aka名字_她叫李清照,没有AKA,这是她的专访//关于“天赋”二字,她说……
  4. php双向链表,双向链表的GO语言实现
  5. 保留两位小数除法算式_北师大|五年级上册|第一周周测·小数除法(1)
  6. HDU3949 XOR (线性基、查找第k小值)
  7. 0x62.图论 - 最小生成树
  8. 轻松掌握mysql数据库锁机制的相关原理_轻松掌握MySQL数据库锁机制的相关原理...
  9. Rabin-Karp ( 字符串匹配 )详解
  10. python控件词语_python文件中的词