Emgu CV4图像处理之图像的几何变换(平移、旋转、转置、镜像)11(C#)

本文测试环境:

win10  64位

vistual studio 2019  

Emgu CV 4.6.0

环境配置准备:

1 新增控制台项目,.net framework为4.7.2

2  把win-x64目录的native目录下的文件全部拷贝到项目的运行目录Debug目录下

3  项目选择x64

4 添加项目引用Emgu.CV.dll、Emgu.CV.Platform.NetFramework.dll、System.Drawing.dll和System.Runtime.InteropServices.RuntimeInformation.dll  

具体配置参考:
Emgu CV4图像处理之环境搭建1(C#)_zxy2847225301的博客-CSDN博客

下面内容部分转自:

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

1 图像平移

在这里插入图片描述

代码如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("chunfen1.png");
            ImgMove(srcPic, 20, 30);
            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }
        /// <summary>
        /// 图像平移
        /// </summary>
        /// <param name="srcPic"></param>
        /// <param name="xOffset"></param>
        /// <param name="yOffset"></param>
        private static void ImgMove(Image<Bgr, Byte> srcPic, int xOffset,int yOffset)
        {
            Image<Bgr, Byte> dstImg = new Image<Bgr, byte>(new System.Drawing.Size(srcPic.Width, srcPic.Height));
            for (int i = 0; i < srcPic.Rows; i++)
            {
                for (int y = 0; y < srcPic.Cols; y++)
                {
                    if ((i + yOffset)>0&&(y + xOffset)>0&&(i + yOffset) < srcPic.Rows && (y + xOffset) < srcPic.Cols)
                    {
                        dstImg[i + yOffset, y + xOffset] = srcPic[i, y];
                    }
                }
            }
            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.Imshow("dstImg", dstImg);
            CvInvoke.WaitKey(0);
        }

       
    }
}

 运行结果如下:

2 图像旋转

在这里插入图片描述 

图中说到的仿射可以参考:仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)

仿射变换(Affine Transformation) - 是大高呀 - 博客园

 

参考代码如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("chunfen1.png");
            ImgRotate(srcPic, 45, 1);
            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }
       

        /// <summary>
        /// 图片旋转
        /// </summary>
        /// <param name="srcPic">原图片</param>
        /// <param name="angle">旋转的角度</param>
        /// <param name="scale">缩放比例</param>
        private static void ImgRotate(Image<Bgr, Byte> srcPic, double angle,double scale)
        {
            //旋转中心点
            PointF center = new PointF(srcPic.Cols/2,srcPic.Rows/2);
            Mat mapMat = new Mat();
            CvInvoke.GetRotationMatrix2D(center, angle, scale, mapMat);
            //CvInvoke.Imshow("mapMat", mapMat);  //发现显示只有标题栏,无图像
            Mat dstPic = new Mat();
            CvInvoke.WarpAffine(srcPic, dstPic, mapMat, new Size(srcPic.Cols, srcPic.Rows));
            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.Imshow("dstPic", dstPic);

            CvInvoke.WaitKey(0);
        }

       
    }
}

运行结果如下:

3   图像转置和镜像

在这里插入图片描述 

转置代码如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("chunfen1.png");
            ImgTranspose(srcPic);
            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }
       
        /// <summary>
        /// 图像转置
        /// </summary>
        /// <param name="srcPic"></param>
        private static void ImgTranspose(Image<Bgr, Byte> srcPic)
        {
            Image<Bgr, Byte> dstPic = new Image<Bgr, byte>(srcPic.Cols, srcPic.Rows);
            CvInvoke.Transpose(srcPic, dstPic);
            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.Imshow("dstPic", dstPic);
            CvInvoke.WaitKey(0);
        }

        
    }
}

 运行结果如下:

图像镜像代码如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("chunfen1.png");
            ImgFlip(srcPic);
            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }
        
        /// <summary>
        /// 图像镜像
        /// </summary>
        /// <param name="srcPic"></param>
        private static void ImgFlip(Image<Bgr, Byte> srcPic)
        {
            Image<Bgr, Byte> dstPic = new Image<Bgr, byte>(srcPic.Cols, srcPic.Rows);
            CvInvoke.Flip(srcPic, dstPic,Emgu.CV.CvEnum.FlipType.Horizontal);//水平镜像
            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.Imshow("dstPic", dstPic);
            CvInvoke.WaitKey(0);
        }
    }
}

 运行结果如下:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值