【技术大揭秘】C# OpenCvSharp轻松去水印,图像修复高招揭秘!

效果

ea3418a50611b4ea41e1c063ca36502b.png

项目

892eba5d97bb5963183d7d9e5ad5a517.png

代码

Form1.cs

using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.Drawing;
using System.Windows.Forms;

namespace OpenCvSharp_去水印_图像修复
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Bitmap bmp;
        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string imgPath = "";
        public Mat img, img0, inpainted, inpaintMask;
        int thickness = 10;
        string CommandText;
        InpaintMethod inpaintMethod;
        ListItem li;

        private void Form1_Load(object sender, EventArgs e)
        {
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
            this.UpdateStyles();

            //添加项:
            cBoxThresholdTypes.Items.Add(new ListItem("NS", InpaintMethod.NS));
            cBoxThresholdTypes.Items.Add(new ListItem("Telea", InpaintMethod.Telea));

            //设置选中项:
            cBoxThresholdTypes.SelectedIndex = 0;    //根据索引

            //驾驶证模板.jpg
            imgPath = "驾驶证模板.jpg";
            bmp = new Bitmap(imgPath);
            pictureBox1.Image = bmp;
            img0 = Cv2.ImRead(imgPath);
            inpaintMask = new Mat(img0.Size(), MatType.CV_8U, Scalar.Black);
            pictureBox2.Image = BitmapConverter.ToBitmap(inpaintMask);
        }

        private void trackBar2_Scroll(object sender, EventArgs e)
        {
            thickness = trackBar2.Value;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
            imgPath = ofd.FileName;
            bmp = new Bitmap(imgPath);
            pictureBox1.Image = bmp;
            img0 = Cv2.ImRead(imgPath);
            inpaintMask = new Mat(img0.Size(), MatType.CV_8U, Scalar.Black);
            pictureBox2.Image = BitmapConverter.ToBitmap(inpaintMask);
            pictureBox3.Image = null;
        }

        private void cBoxThresholdTypes_SelectedIndexChanged(object sender, EventArgs e)
        {
            Inpaint();
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            Inpaint();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image == null)
            {
                return;
            }

            img = img0.Clone();
            inpaintMask = new Mat(img0.Size(), MatType.CV_8U, Scalar.Black);
            inpainted = img0.EmptyClone();

            Window wImage = new Window("image", img);

            OpenCvSharp.Point prevPt = new OpenCvSharp.Point(-1, -1);
            wImage.SetMouseCallback((MouseEventTypes ev, int x, int y, MouseEventFlags flags, IntPtr userdata) =>
            {
                if (ev == MouseEventTypes.LButtonUp || (flags & MouseEventFlags.LButton) == 0)
                {
                    prevPt = new OpenCvSharp.Point(-1, -1);
                }
                else if (ev == MouseEventTypes.LButtonDown)
                {
                    prevPt = new OpenCvSharp.Point(x, y);
                }
                else if (ev == MouseEventTypes.MouseMove && (flags & MouseEventFlags.LButton) != 0)
                {
                    OpenCvSharp.Point pt = new OpenCvSharp.Point(x, y);
                    if (prevPt.X < 0)
                    {
                        prevPt = pt;
                    }
                    inpaintMask.Line(prevPt, pt, Scalar.White, thickness, LineTypes.AntiAlias, 0);
                    pictureBox2.Image = BitmapConverter.ToBitmap(inpaintMask);
                    img.Line(prevPt, pt, Scalar.White, thickness, LineTypes.AntiAlias, 0);
                    prevPt = pt;
                    wImage.ShowImage(img);
                }
            });

            try
            {
                for (; ; )
                {
                    switch ((char)Window.WaitKey(0))
                    {
                        case (char)27:    // exit
                            return;
                        case 'r':
                            inpaintMask.SetTo(Scalar.Black);
                            pictureBox2.Image = BitmapConverter.ToBitmap(inpaintMask);
                            img0.CopyTo(img);
                            wImage.ShowImage(img);
                            break;
                        case 'i':
                        case '\r':
                            Inpaint();
                            break;
                    }
                }
            }
            finally
            {

                Window.DestroyAllWindows();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Inpaint();
        }

        void Inpaint()
        {
            if (pictureBox1.Image == null)
            {
                return;
            }

            li = (ListItem)cBoxThresholdTypes.SelectedItem;
            inpaintMethod = (InpaintMethod)li.Value;

            Cv2.Inpaint(img, inpaintMask, inpainted, trackBar1.Value, inpaintMethod);
            pictureBox3.Image = BitmapConverter.ToBitmap(inpainted);
            CommandText = String.Format("Cv2.Inpaint(src, mask, dst,{0},{1})", trackBar1.Value, inpaintMethod.ToString());
            txtCommandText.Text = CommandText;
        }
    }
}

ListItem.cs

using System.Windows.Forms;

namespace OpenCvSharp_去水印_图像修复
{
    public class ListItem
    {
        /// <summary>
        /// Key
        /// </summary>
        public string Key { get; set; }
        /// <summary>
        /// Value
        /// </summary>
        public object Value { get; set; }

        /// <summary>
        /// 构造函数
        /// </summary>
        public ListItem(string strKey, object strValue)
        {
            this.Key = strKey;
            this.Value = strValue;
        }

        /// <summary>
        /// 重写的ToString
        /// </summary>
        public override string ToString()
        {
            return this.Key;
        }

        /// <summary>
        /// 根据ListItem中的Value找到特定的ListItem(ComboBox的Item设置为ListItem时有效)
        /// </summary>
        /// <param name="cmb">要查找的ComboBox</param>
        /// <param name="strValue">要查找ListItem的Value</param>
        /// <returns>返回ComboBox中符合条件的第一个ListItem,否则返回null</returns>
        public static ListItem FindByValue(ComboBox cmb, string strValue)
        {
            foreach (ListItem li in cmb.Items)
            {
                if (li.Value.ToString() == strValue)
                {
                    return li;
                }
            }
            return null;
        }

        /// <summary>
        /// 根据ListItem中的Key找到特定的ListItem(ComboBox的Item设置为ListItem时有效)
        /// </summary>
        /// <param name="cmb">要查找的ComboBox</param>
        /// <param name="strValue">要查找ListItem的Key</param>
        /// <returns>返回ComboBox中符合条件的第一个ListItem,否则返回null</returns>
        public static ListItem FindByKey(ComboBox cmb, string strText)
        {
            foreach (ListItem li in cmb.Items)
            {
                if (li.Key == strText)
                {
                    return li;
                }
            }
            return null;
        }
    }
}

7e80fd5fce3fd188e2a8f177ca5d72b6.gif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值