数字图像几何变换代码
数字图像的旋转变换、镜像变换、错切变换以及平移变换等称为数字图像的几何变换。下文是数字图像旋转变换、镜像变换以及错切变换的基本原理的介绍以及C#代码的实现。
(1)数字图像旋转变换。
数字图像旋转变换基本原理:
数字图像旋转变换代码实现:
private void btn_Rotate_Click(object sender, EventArgs e)//旋转变换按钮
{
BmapNew = Rotate(60.0, BmapOld);
this.pictureNew.Image = BmapNew;
}
private Bitmap Rotate(double Angle,Bitmap mapOld)//旋转变换代码
{
double rad=Math.PI/180.0*Angle;
Matrix T = new Matrix(3, 3);
T.setElem(0, 0, Math.Cos(rad));
T.setElem(0, 1, -Math.Sin(rad));
T.setElem(1,0, Math.Sin(rad));
T.setElem(1, 1, Math.Cos(rad));
T.setElem(2, 2,1);
int w = mapOld.Width;
int h = mapOld.Height;
Bitmap mapNew = new Bitmap((int)(w * Math.Cos(rad) + h * Math.Sin(rad)) + 1, (int)(w * Math.Sin(rad) + h * Math.Cos(rad)) + 1);
Matrix map = new Matrix(3, 1);
for (int j = 0; j < h; j++)
{
for (int i = 0; i< w; i++)
{
map.setElem(0, 0, i);
map.setElem(1, 0, j);
map.setElem(2, 0, 1);
map = T.mult(map);
Color pixel=mapOld.GetPixel(i,j);
mapNew.SetPixel((int)map.getElem(0, 0) + (int)(h* Math.Sin(rad)), (int)map.getElem(1, 0), pixel);
}
}
return mapNew;
}
(2)数字图像镜像变换
数字图像镜像变换基本原理:
private void btn_JingXiang_Click(object sender, EventArgs e)//镜像变换按钮
{
BmapNew = Mirror(BmapOld);
this.pictureNew.Image = BmapNew;
}
private Bitmap Mirror(Bitmap mapOld)//图片镜像变换代码
{
int w = mapOld.Width;
int h = mapOld.Height;
Matrix T = new Matrix(3, 3);
T.setElem(0, 0, -1);
T.setElem(0, 2, w);
T.setElem(1, 1, 1);
T.setElem(2, 2, 1);
Bitmap mapNew =new Bitmap(w,h);
Matrix map = new Matrix(3, 1);
for (int j = 0; j < h; j++)
{
for (int i = 0; i < w; i++)
{
map.setElem(0, 0, i);
map.setElem(1, 0, j);
map.setElem(2, 0, 1);
map = T.mult(map);
Color pixel = mapOld.GetPixel(i, j);
mapNew.SetPixel((int)map.getElem(0, 0)-1, (int)map.getElem(1, 0), pixel);
}
}
return mapNew;
}
(3)数字图像错切变换
数字图像错切变换基本原理:
数字图像错切变换代码实现:
private void btn_ShearMapping_Click(object sender, EventArgs e)//错切变换按钮
{
BmapNew = ShearMapping(30.0, BmapOld);
this.pictureNew.Image = BmapNew;
}
private Bitmap ShearMapping(double Angle,Bitmap mapOld)//图片错切变换代码
{
double rad = Math.PI / 180.0 * Angle;
int w = mapOld.Width;
int h = mapOld.Height;
int newW = w + (int)(h * Math.Tan(rad));
Bitmap mapNew = new Bitmap(newW, h);
for (int j = 0; j < h; j++)
{
for (int i = 0; i < w; i++)
{
Color pixel = mapOld.GetPixel(i, j);
mapNew.SetPixel((int)((h-j)*Math.Tan(rad))+i, j, pixel);
}
}
return mapNew;
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
C#选择多个文件并读取多个文件数据
原文: C#选择多个文件并读取多个文件数据 版权声明:本文为博主原创文章,转载请附上链接地址。 https://blog.csdn.net/ld15102891672/article/details/80586097 在编程工作中有时候会涉及到在文件管理器中选择多个文件,点击确定后程序可以依次读取所选文件里面的数据,那么该怎么实现呢?小博也是查阅了不少资料才获得的经验,下面小博以C#语言为例,附上一次读取多个文件的主要代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; namespace ... { Class ... { private void button1_Click(object sender, EventArgs e) {...
-
下一篇
基于gulp的前端自动化方案
前言 最近几年前端技术发展日新月异,特别是单页应用的普及。组件化、工程化、自动化成了前端发展的趋势。webpack已经成为了前端打包构建的主流,但是一些老古董的项目还是存在的,也有优化的必要,正好公司的老项目需要优化,不多说拿gulp实践一下。 本文需要安装node(自行安装),并了解过gulp入门。gulp脚本下载:https://github.com/youhunwl/gulp 欢迎star。 实践 创建项目目录 首先初始化npm依赖项与基本信息,使用命令npm init一直回车,生成package.json文件,也可以直接去上边github仓库目录下载。 你的项目目录关系到你的gulp脚本里的任务路径,我脚本里写的是匹配所有的目录和文件。我简单举个例子:这里js/common里的js文件也会被处理。如果只想处理特定目录的文件,请修改任务里的路径。 demo/ ├── css/ │ ├── index.css ├── js/ │ ├── common/ │ │ └─ common.js │ ├── index.js ├── img/ │ ├── logo.png └── ind...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker容器配置,解决镜像无法拉取问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- MySQL数据库在高并发下的优化方案
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题