EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)
程序员文章站
2024-03-18 22:42:40
...
1 图像缩放
补充:超分辨率缩放可实现图像不失真
2 图像平移
3 图像旋转
4 转置和镜像
5 重映射
6 代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.Util;
using System.Drawing;
namespace Lesson12
{
class Program
{
static void Main(string[] args)
{
#region 图像缩放---Resize
//Mat srcImg = CvInvoke.Imread("opencv.jpg");
//CvInvoke.Imshow("src", srcImg);
/////超分辨率,可实现无失真缩放
//Mat dstImg = new Mat();
//CvInvoke.Resize(srcImg, dstImg, new Size(600, 400));
////CvInvoke.Resize(srcImg, dstImg, new Size(), 0.5, 0.5);
//CvInvoke.Imshow("dst", dstImg);
//CvInvoke.WaitKey(0);
#endregion
#region 图像平移
//Image<Bgr, Byte> srcImg = new Image<Bgr, Byte>("1.jpg");
//CvInvoke.Imshow("src", srcImg);
//int xOffset = 100, yOffset = 100;
////不改变图像大小,信息会丢失)
////int dstRows = srcImg.Rows;
////int dstCols = srcImg.Cols;
////会改变图像大小,信息不丢失)
//int dstRows = srcImg.Rows + Math.Abs(yOffset);
//int dstCols = srcImg.Cols + Math.Abs(xOffset);
//Image<Bgr, Byte> dstImg = new Image<Bgr, Byte>(dstCols, dstRows);
//ImgTranslate(srcImg, dstImg, xOffset, yOffset);
//CvInvoke.Imshow("dst", dstImg);
//CvInvoke.WaitKey(0);
#endregion
#region 图像旋转
//Mat srcImg = CvInvoke.Imread("1.jpg");
//PointF center = new PointF(srcImg.Cols / 2, srcImg.Rows / 2);
//double angle = 45;
//double scale = 1;
//Mat rotateMat = new Mat();
//CvInvoke.GetRotationMatrix2D(center, angle, scale, rotateMat);//获取旋转矩阵
//Mat dstImg = new Mat();
//CvInvoke.WarpAffine(srcImg, dstImg, rotateMat, new Size(srcImg.Cols, srcImg.Rows));//进行仿射变换
//CvInvoke.Imshow("dst", dstImg);
//CvInvoke.WaitKey(0);
#endregion
#region 转置镜像
Mat srcImg = CvInvoke.Imread("lena.jpg");
CvInvoke.Imshow("src", srcImg);
Mat dstImg = new Mat();
//CvInvoke.Flip(srcImg, dstImg, FlipType.None); //X
CvInvoke.Flip(srcImg, dstImg, FlipType.Horizontal); //Y
//CvInvoke.Flip(srcImg, dstImg, FlipType.Vertical); //X
CvInvoke.Transpose(dstImg, dstImg); //行列相反
CvInvoke.Imshow("dst", dstImg);
CvInvoke.WaitKey(0);
#endregion
#region 重映射
//Image<Bgr, Byte> srcImg = new Image<Bgr, Byte>("lena.jpg");
//CvInvoke.Imshow("src", srcImg);
//Image<Gray, Single> xMatImg = new Image<Gray, Single>(srcImg.Cols, srcImg.Rows);
//Image<Gray, Single> yMatImg = new Image<Gray, Single>(srcImg.Cols, srcImg.Rows);
//for (int i = 0; i < srcImg.Rows; i++)
//{
// for (int j = 0; j < srcImg.Cols; j++)
// {
// xMatImg[i, j] = new Gray(j);
// yMatImg[i, j] = new Gray(i + 5 * Math.Sin(j / 10.0));
// }
//}
//Mat dstImg = new Mat();
//CvInvoke.Remap(srcImg, dstImg, xMatImg, yMatImg, Inter.Area);
//CvInvoke.Imshow("dst", dstImg);
//CvInvoke.WaitKey(0);
#endregion
}
#region 图像平移实现函数
public static void ImgTranslate(Image<Bgr, Byte> srcImg, Image<Bgr, Byte> dstImg, int xOffset, int yOffset)
{
for (int i = 0; i < srcImg.Rows; i++)
{
for (int j = 0; j < srcImg.Cols; j++)
{
int x = j + xOffset;
int y = i + yOffset;
if (x >= 0 && x < dstImg.Cols && y >= 0 && y < dstImg.Rows)
dstImg[y, x] = srcImg[i, j];
}
}
}
#endregion
}
}
上一篇: 基于C#的2048小游戏