所谓索引图像 ,就是一种把像素值直接作为RGB调色板下标的图像,把像素值直接映射成调色板中的数值。索引图像最多只包含256种颜色,这256中颜色分别对应0-255个值,也就是256种索引值,一般的真彩图像中的实际数据都是RGB或者RGBA数据,而索引图像中的实际数据则是256种索引值,每个索引值对应一种RGB或者RGBA颜色数据,这样讲,相信大家更容易理解一点。

介绍完了索引图像,来引入今天研究的问题。

今天的问题是:索引图像的旋转与缩放

我们以旋转为例,先看一下下面几组测试:

1.索引图像                                                                                                    2.32位真彩图像

3.索引图像旋转45度结果

4.真彩图像旋转45度结果

大家可以看到,上面的测试中,使用相同的旋转算法,但是索引图旋转后明显出现了锯齿现象。

也许你要说锯齿是因为旋转的插值算法问题造成的,这里可以告诉你,上面的测试都是在PS中进行的,使用的是双线性型插值算法。

现在我来解释出现上述结果的原因:

如果我们使用的是真彩图像,那么,图像实际数据是对应的RGBA的值,这样,我们使用插值的结果得到的也是与周围颜色相近的RGBA数据,因此,视觉上没什么差异,就像图4一样,旋转后跟旋转前的图2差不多;

如果我们使用的是索引图像,那么,图像实际数据是RGBA数据对应的索引值,这样,我们使用插值的结果得到的也是与周围索引值相近的一个索引值,注意,得到的是一个索引值,至于这个索引值对应的RGBA数据是不是与周围颜色相近,那我们就不得而知了,因此,也就出现了图3的结果,也就是说图3中,锯齿的地方,是因为插值得到的索引对应的颜色不是黑色,而是白色!

如果还不明白,我们说这样一个例子:

假如真彩图上有三个RGB数据:(200,200,200),P(R,G,B),(100,100,100),其中P是我们要插值得到的,这里我们使用平均法来计算P,那么我们得到的P应该是:

P(150,150,150),这个就是实际的RGB数据,也是我们看到的图像颜色;

假如索引图上有三个索引数据:200,P,100,这三个数据分别表示的是颜色RGB的索引,我们假设三个索引分别对应如下颜色:

200---RGB(200,200,200)

100---RGB(100,100,100)

150--RGB(255,255,255)

我们同样使用平均值法得到P:P=150,,没错,但是这里P对应的实际颜色的RGB值是(255,255,255),这个结果跟真彩图的结果(150,150,150)有着明显的颜色差异!

至此,相信大家已经很清楚了。

我们如何解决这个问题呢?

方案如下:

1,获取索引图像的调色板,也就是颜色表,这个表中记录了索引值与颜色值的对应关系;

2,按照这个颜色表,把索引图像转换为真彩图像;

3,对真彩图像进行缩放与旋转等操作;

4,按照哦1中的颜色表将真彩旋转结果转换为索引图像,这个结果即为所求。

在这个方案中,如果在步骤4中出现旋转之后的图像中的颜色值,在索引表中没有对应关系 ,那么,一般使用的是欧氏距离法,也就是计算当前颜色值与颜色表中 最接近(欧氏距离最小)的颜色值所对应的索引,以此索引作为结果索引即可。

这样就可以完美解决上述 问题了。最后给一个索引图旋转的DEMO,代码没有优化,只是说明而已:点击打开链接

图像算法研究---索引图像旋转缩放锯齿问题相关推荐

  1. 图片(旋转/缩放/翻转)变换效果(ccs3/滤镜/canvas)

    以前要实现图片的旋转或翻转,只能用ie的滤镜来实现,虽然canvas也实现,但ie不支持而且不是html标准. css3出来后,终于可以用标准的transform来实现变换,而canvas也已成为ht ...

  2. PixiJS案例——移动旋转缩放

    简介: 对于选择的图片进行,移动.旋转.缩放.使用 hammer.js 做拖拽操作. 思路: 使用pixi创建一个canvas 添加一个需要移动的精灵 使用hammer做拖拽.双指旋转和缩放 素材: ...

  3. [cocos2d-x]图层的旋转缩放效果

    要实现一个两个图层叠加在一起,然后点击其中的一个图层,实现另外一个图层的旋转缩放的效果. 预期效果: 1.实现两个layer添加在一个场景中. 2.实现点击一个场景能实现另一个场景的旋转缩放的功能. ...

  4. 图像中的一条直线在旋转缩放过程中会有分段现象,或产生分段节点

    图像中的一条直线在旋转缩放过程中会有分段现象. 图像在Windows照片查看器中打开.显示. 使用滚轮放大缩小. 原来的一条直线会分段. 图像旋转方式:16相位(33端).32 原图: 经旋转45,放 ...

  5. 图片的旋转,缩放和拖拽

    由于之前公司项目的原因,我被要求完成一个头像上传功能,其中包括要实现上传图片的旋转,缩放和拖拽,更关键的是要用JS实现... 作为一个不大喜欢用JS的人来说这是一个很严峻的挑战,不过随着项目的进行我的 ...

  6. Unity3D使用鼠标旋转缩放平移视角

    Unity使用鼠标旋转缩放平移视角 用代码在Game界面完美实现Scene界面的操作方法. 使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上. 视角跟踪的是一个空物体,当然如果你是做RPG游 ...

  7. 用矩阵表示图形旋转缩放变换

    二维图形 1.缩放 假设x和y都缩小到0.5倍 那新的x' = 0.5x 新的y' = 0.5y 我们现在通用化一下,假设x方向缩放为Sx,y方向缩放为Sy,并且用矩阵的方法可表示如下 -1 < ...

  8. OpenGL相机自由移动旋转缩放,四元数,欧拉角,LookAt

    OpenGL相机自由移动旋转缩放,四元数,欧拉角,LookAt 定义相机 摄像机位置 右轴 上轴 Look At 自由移动相机 左右移动 移动速度 视角移动 欧拉角 通过欧拉角计算实际的方向向量 缩放 ...

  9. unity 3D模型展示旋转缩放

    目标: 在UI层上 自由观察3D 模型,实现鼠标控制模型的旋转,缩放&& 触摸屏手势控制模型的旋转缩放控制: 这里仅将控制代码挂载到相机上,通过对相机的控制来观察模型. 基本上为最小单 ...

最新文章

  1. 洛谷P1074 靶形数独(跳舞链)
  2. 成都python工作-成都找工作|成都人才网|成都全职招聘信息-成都58同城
  3. 浅谈STM32的DMA模块的使用
  4. 添加事件的兼容性写法
  5. (背)顺序容器的操作-向容器中插入元素详细总结
  6. 利用ffmpeg进行摄像头提取视频编码为h264通过RTP发送数据到指定的rtp地址
  7. python grep awk_文本处理三剑客:grep、sed和awk命令介绍
  8. GB35114—④、附 录A、B
  9. 2022年美赛C题M奖思路复盘(附代码、附论文)
  10. PHP 获取微视无水印源地址_如何提取获取下载美拍、微视、微拍等手机视频
  11. 网站服务器 80端口吗,你的服务器打开IIS80端口了吗?
  12. 毕业论文html代码查重吗,毕业论文中的代码内容重复了怎么办? 毕业论文代码重复率高...
  13. Grounded theory相关知识
  14. datetime的时值
  15. 【ESP01S】使用串口调试助手,发送AT指令收回的是乱码/重复一遍AT指令发回的问题
  16. windows7自带摄像头拍照摄像软件
  17. 【NOIP模拟赛】小猫爬山
  18. Codeforces Round #644 (Div. 3) E.Polygon
  19. SpringBoot:Whitelabel Error Page 404
  20. 进博抢先看 | 辉瑞、默沙东、强生、GSK、西门子医疗、蔡司、霍尼韦尔、江森自控、阿迪达斯、迪卡侬、乐高等将亮相第五届进博会...

热门文章

  1. 记一次操作系统实验测试
  2. R语言学习笔记6_非参数的假设检验
  3. 密码学基本原理和发展——近代密码学
  4. 完爆基金经理?ChatGPT炒股,一年多回报率超500%
  5. RHEL环境搭建--Nginx|Tomcat|Java|Dubbo|RabbitMQ|Redis|Nexus|MySQL
  6. 车用能源的终极:氢能车落地普及还要多久?
  7. 安装macports
  8. DARWIN Survival of the Fittest Fuzzing Mutators读论文笔记
  9. 5、目标检测评估指标
  10. python求加权平均值的方法(附纯python写法)