博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图像处理入门——扭曲
阅读量:5909 次
发布时间:2019-06-19

本文共 1658 字,大约阅读时间需要 5 分钟。

hot3.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开始》,书中使用指针操作,以及移位运算、三角函数的级数展开等方法提高了运算效率

转载于:https://my.oschina.net/soitravel/blog/54401

你可能感兴趣的文章
iOS网络基础 实战进阶篇
查看>>
aidl跨进程通讯
查看>>
以太坊教程:搭建环境、编写编译一个智能合约
查看>>
Kafka简介
查看>>
java编程——高并发大容量NoSQL解决方案探索
查看>>
深入理解-CSS内联元素之font-size
查看>>
自己手撸一个符合Promise/A+的Promise
查看>>
Qtum量子链周报(10月8日-10月14日)
查看>>
如何在vue项目中优雅的使用SVG
查看>>
超过父控件的部分不能响应事件怎么办
查看>>
Java线程池
查看>>
Less 日常用法
查看>>
免费小说阅读小程序
查看>>
js中forEach回调同异步问题
查看>>
33. Search in Rotated Sorted Array
查看>>
HTML-表单
查看>>
Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
查看>>
Android 架构优化~MVP 架构改造
查看>>
动态魔术使用DBMS_SQL
查看>>
Redash本地开发环境搭建
查看>>