文档章节

访问图像像素信息方式的优化

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:41
字数 1217
阅读 7
收藏 0
点赞 0
评论 0

   如果你做图像处理有一定的经验,并且实战过N次,那么你一定知道代码优化对这个行业是多么的重要。今天,我们首先简单谈谈访问图像像素技术的优化。

     首先,我们后面的优化都要基于这个前提:我们是以一维数组的方式来访问图像的数据的,且:

     1、这个一维数组的数组名字为:ImageData

     2、数组的大小为Stride*Height。其中Stride表示图像的一个扫描行占用的字节数,这个数字必须是4的倍数。Height为图像的高度。

     3、数组的类型为byte(unsigned Char?)。

     4、图像的宽度为Width,每个像素占用的字节数用BytePerPixel变量表示,24位图像该变量的值为3,32位图像该变量的值为4.

     首先我们看看如何访问24或32位图像的像素值。比如要获取第X行第Y列(以0为起点)像素的绿色分量,则应该用ImageData(Stride*Y+X*BytePerPixel+1)表示,红色分量则为ImageData(Stride*Y+X*BytePerPixel+2)。好,这样我们就可以写个简单的反色的代码了。

1      For Y =  0  To Height -  1
2          For X =  0  To Width -  1
3             ImageData(Y * Stride + X * BytePerPixel) =  255 - ImageData(Y * Stride + X * BytePerPixel)            ' Blue分量
4             ImageData(Y * Stride + X * BytePerPixel +  1) =  255 - ImageData(Y * Stride + X * BytePerPixel +  1)    ' Green分量
5             ImageData(Y * Stride + X * BytePerPixel +  2) =  255 - ImageData(Y * Stride + X * BytePerPixel +  2)    ' Red分量
6          Next
7      Next

      注意到反色一般是不处理Alpha通道的。

     上述代码思路清晰、描述准确,每行的意义明显,是作为新手最好的熟悉图像内存摆布的表达方式,作为考试题的话肯定是可以打100分的。但是如果是作为项目赚钱的话,顶多是个60分吧。

      首先,我们观察,在每行中出来了大量的重复计算:Y * Stride + X * BytePerPixel,我们应该只要计算一次他就可以,好的,接着改进:

1  For Y =  0  To Height -  1
2      For X =  0  To Width -  1
3         Speed = Y * Stride + X * BytePerPixel
4         ImageData(Speed) =  255 - ImageData(Speed)            ' Blue分量
5         ImageData(Speed +  1) =  255 - ImageData(Speed +  1)    ' Green分量
6         ImageData(Speed +  2) =  255 - ImageData(Speed +  2)    ' Red分量
7      Next
8  Next

     计算速度会有大幅度的提升,好可以拿个80分了。

     还有没有改良的空间呢,注意观察在X层的循环中, Y * Stride始终是一个定量,而我们每次都重复计算了他,有必要把他提到外层的循环中,同时我们还想对X * BytePerPixel做点手脚,尽量减少乘法,毕竟乘法的CPU周期比加法要多一些。好,看我们最后的改进版本:

1  For Y =  0  To Height -  1
2      Speed = Y * Stride
3       For X =  0  To Width -  1
4          ImageData(Speed) =  255 - ImageData(Speed)            ' Blue分量
5          ImageData(Speed +  1) =  255 - ImageData(Speed +  1)    ' Green分量
6          ImageData(Speed +  2) =  255 - ImageData(Speed +  2)    ' Red分量
7          Speed = Speed + BytePerPixel                         ' 跳到下一个像素
8       Next
9   Next

      也有人喜欢用下面的方式:

 1     LineAddBytes = Stride - Width * BytePerPixel
 2      For Y =  0  To Height -  1
 3          For X =  0  To Width -  1
 4             ImageData(Speed) =  255 - ImageData(Speed)            ' Blue分量
 5             ImageData(Speed +  1) =  255 - ImageData(Speed +  1)    ' Green分量
 6             ImageData(Speed +  2) =  255 - ImageData(Speed +  2)    ' Red分量
 7             Speed = Speed + BytePerPixel                         ' 跳到下一个像素
 8          Next
 9         Speed = Speed + LineAddBytes                             ' 补齐扫描行最后的数据
10      Next

      第二种表达方式更加突出了扫描行的大小并不一定等于图像宽度*每像素的占用的字节数,所以在每次扫描一行之后要注意补齐未处理的那部分。这也是很多图像处理初学者在处理图像时可能会遇到处理后的图像效果沿对角线错位的原因。包括我们很多的专业的数字图像处理书,比如我常看的朗锐的那本VC图像处理教程,都没有很注意这个问题。而那些教材一般所测试用的图像是传说中的lena图像,这个图像大小似乎是256*256,由于宽度正好是4的倍数,LineAddBytes这个变量为0,因此这个问题就被隐藏起来了。

     我个人更习惯于使用第一种表达方式。

     对于使用C或C++编程的朋友,上述代码还有可以优化的地方,++运算符能替代某些算式的。

     有两个问题提醒大家注意:

     1、图像处理算法中在正常情况下都是先按行处理,在进行列方向递增,这样做对于代码的优化有很大的好处,因为图像在内存的数据摆布也是一行接着一行的。

     2、两个方向的循环注意一般都是从下标0开始的,一般不建议从1开始。

 

 

本文转载自:http://www.cnblogs.com/Imageshop/archive/2011/11/12/2246362.html

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6196
码字总数 1876
作品 0
深圳
项目经理
Correcting Over-Exposure in Photographs

论文:Correcting Over-Exposure in Photographs 本论文主要讨论过曝光校正算法。所谓过曝光,示例如下所示: 过曝光图片校正示例 图片中女孩脸部有部分过亮(用蓝色画出部分)。为了达到曝光...

Mordekaiser
2017/07/20
0
0
浅谈Web图像优化

前端优化有很多,图像优化也是其中的一部分。无论是渐进增强还是优雅降级,图像优化成为了开发上不可忽视的一部分。 知其然,须知其所以然 图像优化的前提是需要了解图像的基本原理。常规的图...

johnson
2017/10/24
0
0
都说 WebP 厉害,究竟厉害在哪里?

之前在《 WebP 的前世今生 》一文中,介绍了 WebP 图片格式是由 Google 基于 VP8 视频编码格式研发的,同时提供有损压缩和无损压缩两种格式,那么今天就来看看 WebP 有损压缩与无损压缩的具体...

又拍云
2017/11/10
0
0
图像检索的三种python实现(直方图/OpenCV/哈希法)

简介: 本文介绍了图像检索的三种实现方式,均用python完成,其中前两种基于直方图比较,哈希法基于像素分布。 检索方式是:提前导入图片库作为检索范围,给出待检索的图片,将其与图片库中的...

漫步当下
07/09
0
0
SLAM笔记(六)直接法介绍

本章整理自高翔的SLAM十四讲之《直接法的原理与实现》以及PAMI上的《Direct Sparse Odometry》 1 之前总结的方法都需要先从图片中提取特征点并进行匹配,然后进行优化求解,这类方法称为特征...

Kevin_cc98
2017/04/28
0
0
输赢不重要,斗图最重要的是高清无码

摘要 为了提升用户的斗图体验,Gfycat 希望用机器学习来制作更高分辨率的 GIF 图。 GIF 图是表达情绪的好方式,但在层层传播中总会被压缩,分辨率变低,图像模糊。为了提升用户的斗图体验,G...

刘丢丢
2017/12/14
0
0
JS写小游戏「跳一跳」外挂之Canvas图像识别

17年结尾的时候微信发布新版重点推出了「小游戏」概念,H5的游戏再次火了起来,新版微信开屏的游戏就是「跳一跳」游戏可玩度很高,网上也出现了各种语言版本的外挂,前几天看到一篇用nodejs搭...

a独家记忆
07/12
0
0
canvas粒子动画

周末在家玩了一下canvas粒子动画,先看看效果,用的图是我们微众银行的干爹‘qq’,先看看效果 1.获取图片信息 1.1首先将想要绘制的图片绘制到canvas画布上 1.2.获取图像信息 将第一步绘制的...

小尾巴儿
2016/11/06
66
0
【Qt笔记】绘制设备

绘图设备是继承的类。就是能够进行绘制的类,也就是说,可以在任何的子类上进行绘制。现在,Qt 提供了若干这样的类: 在 Qt5 中,已经被废弃。本章我们关注的是、、和这几个类。另外的部分,...

大道无名
2016/07/31
40
0
深度:自动驾驶特斯拉背后核心技术解析

导语:深度解密自动驾驶技术,赶紧过来围观。 本文作者魏秀参,谢晨伟南京大学计算机系机器学习与数据挖掘所(LAMDA),研究方向为计算机视觉和机器学习。 说起特斯拉,大家可能立马会想到今...

yousss
04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
53分钟前
0
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部