最近在学习C语言的图像处理,真的很郁闷,感觉不知道路。 另外,老师要求尽快掌握,处理图像数据。 在网上找一下并及时消化,希望对学习和理解有帮助。
C语言图像处理方法
1 .平移图像
平移图像只会改变图像在屏幕上的位置,而图像本身不会改变。
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 .图像反转
翻转图像是指将定义的图像区域上下翻转并显示在屏幕上。 分析图像反演的过程,可以找到各行的图
保留所有信息,只是更改了行的顺序,交换第1行和最后的第n行,第2行与第n - 1行交叉
……,通过这样类推,实现了图像的反转。 只需逐行交换,即可轻松修改缓冲区内容
当前图像的反转。 基本步骤如下。
(1) getimage ) )保存原图像,删除原图像。
)2)计算图像高度,即行数height; 计算图像宽度width; 计算并保存一行的图像信息
height=bottom - top 1;
width=right - left 1;
行字节=(width7)/8 * 4;
)3)利用行交换缓冲器linebuf在图像存储缓冲器内进行信息交换。 即,交换第一行和最后一行,与第二行
第n-1行的交换……,以下同样,等待所有的交换完成。
)4)在屏幕上重新显示更换的图像缓冲区的内容。
3 .图像镜像转换
镜像转换是指将指定区域的图像左右翻转后显示在屏幕上。 对镜像转换过程的分析表明,每行的图像信息
的处理方法相同,且行的顺序不变。 但是,每行的像素信息按照从左到右的顺序左右相反。
这样,实现了镜像转换。 因此,通过逐行转换的方式实现图像镜像。
首先,对于左上为(left,top )、右下为(right,bottom )的矩形领域的图像,给出其中的任意点(x0,y0 ) )
镜像转换后的新坐标(x,y ) )的坐标转换公式:
x'=right-x0 left
y'=y0
根据上述公式,计算出每个像素点的新坐标后,将其直接显示在屏幕上的相应位置。
如果完全按点对换,则处理一个像素点时将读取一次像素值,从而降低转换速度。 像素点为顺序
依次存储在各位中,每读取一个字节包含8像素的信息,只需设置不同的位掩码值bitmask即可获取
需要不同像素点的信息。 因此,采用逐行字节转换方案,每读一次转换8像素点,以提高转换速度。
镜像变换矩形区域图像的基本步骤如下。
)1) getimage ) )将图像保存在内存缓冲区中,删除原始图像。
2 )计算图像高度,即行数的高度height和宽度width; 计算存储一行图像信息所需的字节数linebytes。 制定计划
计算公式如下。
height=bottom - top 1;
width=right - left 1;
行字节=(width7)/8 *4;
)3)镜像图像。
)4)释放内存映像缓冲区。
4 .旋转图像
图像旋转是指将定义的图像绕某一点逆时针或顺时针旋转一定的角度,通常以图像中心为中心反向旋转
时针方向旋转。
假设图像的左上角为(left,top ),右下角为(right,bottom ),则图像上的任意点(x0,y0 )以其中心为中心
(xcenter,ycenter )逆时针旋转角度时的新坐标位置(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和为了保存1行图像信息而占有的字节数linebytes,计算式和镜像变化
中选择另一种天花板类型。
)3)逐行旋转转换图像。
)4)释放内存映像缓冲区。
值得注意的是,这种处理方法不够。 为此,在图像转换缓冲器中结束处理后
转换后的图像一次显示在屏幕上。 这样可以获得良好的显示效果。