1.图像平移

图像平移只是改变图像在屏幕上的位置,图像本身并不发生变化。
假设原图像区域左上角坐标为(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语言实现计算机图像处理的方法相关推荐

  1. 计算机图像技术在医学上的应用,计算机图像处理技术在医学中的应用

    摘要:现代医学越来越离不开医学图像信息.医疗设备或系统的支持,在医学图像处理和医学设备中,超声成像.CT.磁共振.外科手术.中医舌像诊断都与计算机图像处理技术息息相关. 关键词:计算机技术:医学图像: ...

  2. 图像处理基本方法-c语言调用opencv实现人脸检测功能

    图像处理基本方法-c语言调用opencv-实现BMP图片中人脸检测功能 使用opencv检测bmp图片中人脸,主要使用cvHaarDetectObjects函数实现. 函数定义 CvSeq* cvHa ...

  3. Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法

    Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)-命令提示符cmd的几种方法 目录 利用python语言实现调用内部命令-命令提示符cmd的几种方法 T1. ...

  4. 如何计算机闲置虚拟机算法_利用闲置计算机的最佳方法

    如何计算机闲置虚拟机算法 If you leave your computer on when you are not using it, there are ways you can put you ...

  5. c语言程序 5ms 延时,计算机单片机延时方法电脑c语言.docx

    计算机单片机延时方法电脑C 语言 您需要登录后才可以回帖登录| 注册发布 单片机是一种集成电路芯片,是采用超大规模集成电路技术把 具有数据处理能力的中央处理器CPU.随机存储器RAM.只读存储器 RO ...

  6. C语言编程>第九周 ④ 编写函数fun,它的功能是:利用以下所示的简单迭代方法求方程cos(y)-y=0的一个实根。yn+1=cos(yn)

    例题:编写函数fun,它的功能是:利用以下所示的简单迭代方法求方程cos(y)-y=0的一个实根. yn+1=cos(yn) 迭代步骤如下: (1)取y1初值为0.0. (2)y0=y1,把y1的值赋 ...

  7. 利用C语言编辑画图程序的实现方法

    不知道大家在进行开发县级电网调度自动化系统的时候,是否都会遇到一个问题就是:要绘制一个电力系统一次接线图.大家都应该知道其实电力系统的一次接线图是较为复杂的,如果想要使用一般的编程方法来进行绘制的话, ...

  8. c语言指针生成numpy数组,利用ctypes获取numpy数组的指针方法

    利用ctypes获取numpy数组的指针方法 如下所示: import numpy as np from ctypes import * a = np.asarray(range(16), dtype ...

  9. C语言的排序方法(选择排序和利用C语言的库存排序)

    1.方法1:利用选择排序: 升序:从小排到大. #include <stdio.h> void sort(int a[],int n); int main() {int n,i;scanf ...

最新文章

  1. 一年计划-献给我已经逝去的青春(初出茅庐的小白)
  2. R语言描述性统计分析:假设检验
  3. linux系统管理命令--系统测试工具
  4. win8 远程桌面时提示凭证不工作问题的终极解决办法
  5. codeforces 拼手速题2
  6. python代码颜色不同_python – 两个不同颜色的颜色在同一个imshow matplotlib
  7. easyPR源码解析之plate_locate.h
  8. iPhone 诈骗又出新招,别看见弹窗就输密码
  9. ios 将随意对象存进数据库
  10. hibernate示例_Hibernate条件示例教程
  11. 2013dgtcs 数对
  12. 移动端动画使用transform提升性能
  13. 巧用CSS居中未知高度的块元素
  14. word横向网格线设置在哪里_word表格中横向网格线
  15. 一次用Python制作电影字幕的尝试
  16. tpshop——安装使用
  17. mysql导出数据库1146_MySQL复制出错 Last_SQL_Errno:1146的解决方法
  18. console的基础使用
  19. 逆向分析:还原 App protobuf 协议加密
  20. HDU-6578 Blank(DP)2019暑假杭电多校第一场

热门文章

  1. 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)
  2. Eclipse 通过 JDBC 连接 SQL Server
  3. PHP中英文截取函数,php字符串截取函数,支持中英文混体
  4. CCIE-LAB-第四篇-OSPFv2+SHA384+BFD
  5. 【BZOJ - 3993】星际战争(网络流最大流+二分)
  6. 【CodeForces - 546C 】Soldier and Cards (模拟)
  7. 【CodeForces - 357D】Xenia and Hamming (字符串问题,数论,思维)
  8. 【HDU - 2717】【POJ - 3278】Catch That Cow (经典bfs,类似dp)
  9. 【HihoCoder - 1268】九宫 (dfs,深搜)
  10. TreeMap实现对中文的排序