图像编程学习笔记6——图像转置

转置(transpose)是指将x,y坐标对换,图2.2的转置如图2.15所示。


图2.2

图2.15   图2.2的转置

要注意的是,转置和旋转900是有区别的,不信你可以试试:怎么旋转,图2.2也转不出图2.15来。另外,转置后图的宽高对换了。转置的变换矩阵很简单:

                                                                                          

 

(2.12)

镜象变换的源代码如下,因为和旋转的那段程序很类似,程序中的注释就简单一些:

由于很多代码和之前的重复,所以只给出主要功能代码(win32 控制台程序)

 

[cpp] view plaincopy

 

    1. void transpose()  
    2. {  
    3.     int height = bmpInfoHeader.biHeight;  
    4.     int width = bmpInfoHeader.biWidth;  
    5.     int imgSize = bmpInfoHeader.biSizeImage;  
    6.     //转置之后高宽变了  
    7.     bmpInfoHeader.biHeight = width;  
    8.     bmpInfoHeader.biWidth = height;  
    9.     memset(pNewBmpData,0,sizeof(unsigned char )*imgSize);  
    10.     int lineByte = (width * 8 + 31) / 32 * 4;  //每行像素的字节数  
    11.     int newLineByte = (height * 8 + 31) / 32 * 4;  //新的lineByte  
    12.     for(int i = 0; i < height; i++ )  
    13.     {  
    14.         for(int j = 0; j < width; j++ )  
    15.         {  
    16.             *(pNewBmpData + (width - 1 - j)*newLineByte + i) = *(pBmpData + (height - 1 - i)*lineByte + j); //转置  
    17.         }  
    18.     }  
    19. }  
时间: 2024-08-21 04:54:33

图像编程学习笔记6——图像转置的相关文章

图像编程学习笔记8——图像的平滑(去噪)

第一种方法:高斯模版 以下文字内容copy于<<数字图像处理编程入门>>,code为自己实现,是win32控制台程序. 先举个例子说明一下什么是平滑(smoothing),如下面两幅图所示:可以看到,图3.2比图3.1柔和一些(也模糊一些).是不是觉得很神奇?其实实现起来很简单.我们将原图中的每一点的灰度和它周围八个点的灰度相加,然后除以9,作为新图中对应点的灰度,就能实现上面的效果. 这么做并非瞎蒙,而是有其道理的.大概想一想,也很容易明白.举个例子,就象和面一样,先在中间加点水

图像编程学习笔记7——图像缩放

假设放大因子为ratio,(为了避免新图过大或过小,我们在程序中限制0.25≤ratio≤4),缩放(zoom)的变换矩阵很简单: (2.13) 缩放变换的源代码如下,因为和转置的那段程序很类似,程序中的注释就简单一些.   [cpp] view plaincopy   /**  * 函数名: zoom  * 参  数: ratio -- 缩放率  * 功  能: 对图片进行水平和垂直镜像操作  *         只保存原图大小的图像数据,如果没有就用白色填充  */   void zoom(

图像编程学习笔记3——图像旋转

以下文字内容copy于<<数字图像处理编程入门>>,code为自己实现,是win32控制台程序.   旋转(rotation)有一个绕着什么转的问题,通常的做法是以图象的中心为圆心旋转,举个例子,图2.7旋转30度(顺时针方向)后如图2.8所示: 可以看出,旋转后图象变大了.另一种做法是不让图象变大,转出的部分被裁剪掉.如图2.9所示. 我们采用第一种做法,首先给出变换矩阵.在我们熟悉的坐标系中,将一个点顺时针旋转a角后的坐标变换公式,如图2.10所示,r为该点到原点的距离,在旋转

图像编程学习笔记5——图像镜像

以下文字内容copy于<<数字图像处理编程入门>>,code为自己实现,是win32控制台程序.   镜象(mirror)分水平镜象和垂直镜象两种.图2.2的水平镜象和垂直镜象分别如图2.13和图2.14所示 图2.13   图2.2的水平镜象                                                                                     图2.14   图2.2的垂直镜象 镜象的变换矩阵很简单.设原图宽为w,

图像编程学习笔记9——图像的锐化

锐化(sharpening)和平滑恰恰相反,它是通过增强高频分量来减少图象中的模糊,因此又称为高通滤波(high passfilter).锐化处理在增强图象边缘的同时增加了图象的噪声. 常用的锐化模板是拉普拉斯(Laplacian)模板(见(3.4)式),又是个数学家的名字,可见学好数学,走遍天下都不怕.   (3.4) 容易看出拉普拉斯模板的作法:先将自身与周围的8个象素相减,表示自身与周围象素的差别:再将这个差别加上自身作为新象素的灰度.可见,如果一片暗区出现了一个亮点,那么锐化处理的结果是

图像编程学习笔记2——bmp位图平移

以下文字内容copy于<<数字图像处理编程入门>>,code为自己实现,是win32控制台程序. 2.1 平移 平移(translation)变换大概是几何变换中最简单的一种了. 如图2.1所示,初始坐标为(x0,y0)的点经过平移(tx,ty)(以向右,向下为正方向)后,坐标变为(x1,y1).这两点之间的关系是x1=x0+tx,y1=y0+ty.   图2.1    平移的示意图 以矩阵的形式表示为 (2.1)           我们更关心的是它的逆变换: (2.2) 这是因

图像编程学习笔记4——24位真彩色转换为灰度图像

以下文本内容来自http://zhidao.baidu.com/question/152910968.html中的部分内容 把RGB值转换为灰度值的公式:Gray   :=   Trunc(0.3   *   Red   +   0.59   *   Green   +   0.11   *   Blue);//这句用的是浮点运算在图像处理中,速度就是生命,能不用浮点运算,就最好不要用!Gray   :=   (30   *   Red   +   59   *   Green   +   11

信息-图像编程学习,位图存取

问题描述 图像编程学习,位图存取 请问 //图像数据信息是从左下角按行开始存储的 for(int i = 0; i < biHeight; i++ ) { for(int j = 0; j < biWidth; j++ ) { for(int k = 0; k < 3; k++ ) { int temp = *(pBmpBuf + i * lineByte + j + k); count++; outfile<<temp<<" "; if(co

Socket网络编程学习笔记(3):利用套接字助手类

在上一篇中已经介绍了利用Socket建立服务端和客户端进行通信,如果需要 的朋友可访问<Socket网络编程学习笔记(2):面向连接的Socket>.在本篇 中,将利用C#套接字的助手类来简化Socket编程,使得刚刚接触到网络编程的 朋友们更容易上手. 跟上篇一样,通过C#套接字的助手类来编程同样分 服务端和客户端. 一.服务端侦听模式 1.创建套接字与 IPEndPoint绑定,并设置为侦听模式. 1//创建IPEndPoint实例 2 IPEndPoint ipep = new IPEn