C语言图像处理方法

2016-02-19 18:34 85 1 收藏

今天图老师小编要向大家分享个C语言图像处理方法教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】


  1.图像平移
  图像平移只是改变图像在屏幕上的位置,图像本身并不发生变化。
   !-- frame contents -- !-- /frame contents --   假设原图像区域左上角坐标为(x0, y0),右下角坐标为(x1, y1),将图像分别沿x和y轴平移dx和dy,则新图像的左上角坐标为(x0 +dx, y0+dy),右下角坐标为(x1+dx, y1+dy)。坐标平移变换公式为:
  x′ = x + dx
  y′ = y + dy
  在屏幕上实现图像的移动分为四个步骤:
  ⑴ 保存原图像到缓冲区。
  ⑵ 擦除原图像。
  ⑶ 计算平移后的新坐标。
  ⑷ 在新的坐标位置重新显示原图像。
  其中,擦除原图像的方法与图形变换中擦除原图形的方法一致,在实现中仍采用XOR异或方式画图擦除原图像。对于新坐标值的计算还需要考虑边界情况,不要在图像平移后超出答应的屏幕范围。此外,假如采用C函数getimage()和putimage()来保存和恢复图像,则图像的大小不能超过64K。
  2.图像颠倒
  图像颠倒是指把定义好的图像区域上下翻转地显示在屏幕上。分析图像颠倒的过程,可发现每行的图像信息都保持不变,而只是改变了行的顺序,将第一行与最后的第n行相互交换,第二行与第n-1行交换……,依此类推,从而实现了图像的颠倒。只需采用按行交换的方式,即可方便地修改缓冲区内容,实现图像的颠倒。基本步骤如下:
  (1) 用getimage()保存原图像,并擦除原图像。
  (2) 计算图像的高度,即行数height;计算图像宽度width;计算保存一行图像信息
   height = bottom - top + 1;
   width = right - left + 1;
  linebytes = (width + 7) / 8 * 4;
  (3)利用行交换缓冲区linebuf在图像内存缓冲区中进行信息交换,即把第一行与最末行交换,第2行与第n-1行交换……,依此类推,直至全部交换完毕。
    (4)把交换后的图像缓冲区内容重新显示在屏幕上。
  3.图像镜像变换
  镜像变换是指将指定区域的图像左右翻转地显示在屏幕。分析镜像变换过程可以发现:每行图像信息的处理方式是相同的,而且行顺序不发生变化,只是每一行的像素信息按从左到右的顺序进行了左右颠倒,从而实现了镜像变换。因此,采用按行逐点变换的方式实现图像的镜像。
  首先,对于左上角为(left, top),右下角为(right, bottom)矩形区域图像,给出其中任意点(x0, y0)镜像变换后的新坐标(x′, y′)的坐标变换公式:
  x = right - x0 + left
  y′ = y0
  根据以上公式,对各个像素点计算新坐标后,直接把它显示在屏幕的相应位置上。
  假如完全逐点地进行交换,处理一个像素点就要读取一次像素值,从而降低了变换速度。由于像素点是顺序存放在各个bit位上,每读取一个字节就包含了8个像素点的信息,只需设置不同的位屏值bitmask,就可以获得不同像素点的信息。因此采用按行逐字节变换的方式,每读一次就进行8个像素点的变换,以提高变换速度。
  将一矩形区域的图像进行镜像变换的基本步骤如下:
  (1) 用getimage()把图像保存到内存缓冲区,并擦除原图像。
  (2) 计算图像高度,即行数高度height和宽度width;计算保存一行图像信息占用的字节数linebytes。计算公式如下:
  height = bottom - top + 1;
  width = right - left + 1;
  linebyte = (width + 7) / 8 *4;
  (3) 对图像进行镜像。
  (4)释放内存图像缓冲区。
  4.图像旋转
  图像旋转是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度,通常是指绕图像的中心以逆时针方向旋转。
  假设图像的左上角为(left, top),右下角为(right, bottom),则图像上任意点(x0, y0)绕其中心(xcenter,ycenter)逆时针旋转angle角度后,新的坐标位置(x′, y′)的计算公式为:
  xcenter = (right - left + 1) / 2 + left;
  ycenter = (bottom - top + 1) / 2 + top;
  x′ = (x0 - xcenter) cosθ - (y0 - ycenter) sinθ + xcenter;
  y′ = (x0 - xcenter) sinθ + (y0 - ycenter) cosθ + ycenter;
  与图像的镜像变换相类似,也采用按行逐点变换的方式实现图像的旋转,其步骤如下:
  (1) 用getimage()把图像保存到内存缓冲区,并擦除原图像。
  (2) 计算图像高度height,宽度width,及保存一行图像信息占用的字节数linebytes,计算公式与镜像变换的计算公式相同。
  (3) 对图像逐行进行旋转变换。
  (4) 释放内存图像缓冲区。
  值得指出的是,这种处理方法不够。为此可以采用另一种方法:先在图像变换缓冲区中处理完毕后,再将变换后的图像一次显示在屏幕上。这样可以取得较好的显示效果。 更多内容请看C/C++进阶技术文档专题,或

来源:http://www.tulaoshi.com/n/20160219/1618168.html

延伸阅读
Bat.aspx: 程序代码  代码如下: %@ Page Language="C#" AutoEventWireup="true" CodeFile="Bat.aspx.cs" Inherits="Bat" % !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" html xmlns="http://www.w3.org/1999/xhtml" head runat="server" titleC#调...
C++语言是一种应用较广的面向对象的程序设计语言,使用它可以实现面向对象的程序设计。面向对象的设计与面向过程的设计是有很大区别的,面向对象的程序设计是在面向过程的程序设计的基础上一个质的飞跃。要学会面向对象的程序设计,首先要学会一种面向对象的语言,即要学会用VC编程,就要先有C++的基础,而学习C++语言首先要熟悉它面向对象...
Java以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,...
Turbo C提供了非常丰富的图形函数, 所有图形函数的原型均在graphics. h 中, 本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图 形窗口以及图形模式下的文本输出等函数。另外, 使用图形函数时要确保有显示 器图形驱动程序*BGI, 同时将集成开发环境Options/Linker中的Graphics lib选 为on, 只有这样才能保证正...
1. strUCt的巨大作用 面对一个人的大型C/C++程序时,只看其对struct的使用情况我们就可以对其编写者的编程经验进行评估。因为一个大型的C/C++程序,势必要涉及一些(甚至大量)进行数据组合的结构体,这些结构体可以将原本意义属于一个整体的数据组合在一起。 !-- frame contents -- !-- /frame contents -- 从某种程度上来说,会...

经验教程

424

收藏

16
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部