c语言图像处理 扭曲,图像处理入门——扭曲

本文介绍了图像扭曲中的膨胀和挤压概念,利用复变函数进行像素点坐标变换。提供了C#代码实现这两种效果,膨胀使图像向外扩张,挤压则使其向内收缩。通过调整参数可以改变扭曲程度,并通过边界约束处理防止像素溢出。
摘要由CSDN通过智能技术生成

图像的扭曲是按照一定的映射将像素点从原来的位置移动到新的位置,这种映射可以用复变函数表示

516d1eac5b1b7e6201567f28673d90af.png

膨胀:

在极坐标下,设原来的坐标为(r,α),变换后的新坐标为(R,β):

R = r * r * degree

β = α

其中 degree 是可变参数。该映射使得图像向外扩张。下面是c#中的代码

///

/// 膨胀

///

/// 要处理的图片

/// 扭曲的幅度

/// 处理后的图片

public Bitmap Distortion(Bitmap bmp, int degree)

{

Bitmap retBmp = bmp.Clone() as Bitmap;

int width = bmp.Width;

int height = bmp.Height;

// 原点的x和y坐标

int midX = width / 2;

int midY = height / 2;

// 极坐标角度

double theta;

// 极坐标半径

double radius;

int offsetX, offsetY;

int xx, yy;

for (int y = 0; y < height; y++)

{

// 当前处理的像素点与原点的纵向偏离量

offsetY = y - midY;

for (int x = 0; x < width; x++)

{

// 当前处理的像素点与原点的横向偏离量

offsetX = x - midX;

// 计算新坐标的在极坐标下表示的角度和半径

theta = Math.Atan2(offsetY, offsetX);

radius = Math.Sqrt(offsetX * offsetX + offsetY * offsetY);

// 反推出对应的原坐标的半径

radius = Math.Sqrt(radius) * degree;

// 原坐标的直角坐标系中的位置(xx,yy)

xx = (int)(radius * Math.Cos(theta)) + midX;

yy = (int)(radius * Math.Sin(theta)) + midY;

// 边界约束,如果超出边界只好用边界的像素代替

if (xx < 0) xx = 0;

if (xx >= width) xx = width - 1;

if (yy < 0) yy = 0;

if (yy >= height) yy = height - 1;

// 将原坐标像素点移动到新坐标

retBmp.SetPixel(x, y, bmp.GetPixel(xx, yy));

}

}

return retBmp;

}

挤压:

R = sqrt(r) * degree

β = α

该映射使得图像向内收缩

只要把代码中 38 ~ 41 行的去掉,改成:radius = (offsetX * offsetX + offsetY * offsetY) / degree;

以上主要参考《图像编程精髓——从开发自己的Photoshop开始》,书中使用指针操作,以及移位运算、三角函数的级数展开等方法提高了运算效率

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值