欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)

程序员文章站 2024-03-18 22:42:40
...

1 图像缩放

EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)
补充:超分辨率缩放可实现图像不失真

2 图像平移

EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)
EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)

3 图像旋转

EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)
EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)

4 转置和镜像

EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)

5 重映射

EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)
EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)

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
    }

}

相关标签: EmguCV