C# OpenCvSharp 去水印 图像修复

效果

dbf161b9f445f8e3841443aeb569494d.png

项目

ccf49bd838dfbfb6dbf036e25f1d95f3.png

代码

Form1.cs

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

namespace OpenCvSharp_去水印
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        bool IsDraw;
        System.Drawing.Point StartPoint, EndPoint;
        Pen p = new Pen(Color.Red, 2);
        Bitmap originImg;
        Image finishImg;

        Pen pen = new Pen(Color.Red, 2);
        public System.Drawing.Point[] pt = new System.Drawing.Point[4];
        Font font = new Font("宋体", 12);
        SolidBrush solidBrush = new SolidBrush(Color.Red);

        Rectangle rect;

        Graphics g;

        Bitmap bmp;
        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string img = "";

        Mat src;
        Mat maskROI;
        Mat mask;
        Mat dst = new Mat();
        Rect roiRect;

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
           
            img = ofd.FileName;
            bmp = new Bitmap(img);
            pictureBox1.Image = bmp;

            src = new Mat(img);

            g = pictureBox1.CreateGraphics();
            g.SmoothingMode = SmoothingMode.AntiAlias;  //使绘图质量最高,即消除锯齿
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.CompositingQuality = CompositingQuality.HighQuality;

            p.StartCap = LineCap.Square;
            p.EndCap = LineCap.Square;

            originImg = new Bitmap(img);
            finishImg = (Image)originImg.Clone();

        }

        private void button4_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = bmp;
            originImg = new Bitmap(img);
            finishImg = (Image)originImg.Clone();
        }

        /// <summary>
        /// 鼠标左键按下
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                IsDraw = true;
                GetImagePixLocation(pictureBox1.Size, pictureBox1.Image.Size, e.Location, out StartPoint);
            }
        }

        /// <summary>
        /// 鼠标滑动
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (IsDraw)
            {
                GetImagePixLocation(pictureBox1.Size, pictureBox1.Image.Size, e.Location, out EndPoint);
                finishImg = (Image)originImg.Clone();

                g = Graphics.FromImage(finishImg);
                g.SmoothingMode = SmoothingMode.AntiAlias;

                System.Drawing.Point leftTop = new System.Drawing.Point(StartPoint.X, StartPoint.Y);
                int width = Math.Abs(StartPoint.X - EndPoint.X), height = Math.Abs(StartPoint.Y - EndPoint.Y);
                if (EndPoint.X < StartPoint.X)
                    leftTop.X = EndPoint.X;
                if (EndPoint.Y < StartPoint.Y)
                    leftTop.Y = EndPoint.Y;
                rect = new Rectangle(leftTop, new System.Drawing.Size(width, height));
                g.DrawRectangle(p, rect);
                pictureBox1.Image = finishImg;
            }
        }


        private void GetImagePixLocation(System.Drawing.Size pictureBoxSize, System.Drawing.Size imageSize, System.Drawing.Point pictureBoxPoint, out System.Drawing.Point imagePoint)
        {

            imagePoint = new System.Drawing.Point(0, 0);

            double scale;

            int detalInHeight = 0;

            int detalInWidth = 0;

            if (Convert.ToDouble(pictureBoxSize.Width) / pictureBoxSize.Height > Convert.ToDouble(imageSize.Width) / imageSize.Height)
            {
                scale = 1.0 * imageSize.Height / pictureBoxSize.Height;
                detalInWidth = Convert.ToInt32((pictureBoxSize.Width * scale - imageSize.Width) / 2.0);
            }

            else
            {
                scale = 1.0 * imageSize.Width / pictureBoxSize.Width;
                detalInHeight = Convert.ToInt32((pictureBoxSize.Height * scale - imageSize.Height) / 2.0);
            }

            imagePoint.X = Convert.ToInt32(pictureBoxPoint.X * scale - detalInWidth);

            imagePoint.Y = Convert.ToInt32(pictureBoxPoint.Y * scale - detalInHeight);

        }

        /// <summary>
        /// 鼠标左键弹起
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            IsDraw = false;
            originImg = (Bitmap)finishImg;
            pictureBox1.Image = originImg;
        }

        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;    //根据索引


            img = "驾驶证模板.jpg";
            bmp = new Bitmap(img);
            pictureBox1.Image = bmp;

            src = new Mat(img);

            g = pictureBox1.CreateGraphics();
            g.SmoothingMode = SmoothingMode.AntiAlias;  //使绘图质量最高,即消除锯齿
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.CompositingQuality = CompositingQuality.HighQuality;

            p.StartCap = LineCap.Square;
            p.EndCap = LineCap.Square;

            originImg = new Bitmap(img);
            finishImg = (Image)originImg.Clone();
        }

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

            if (rect == null || (rect.Width==0 && rect.Height==0))
            {
                return;
            }

            maskROI = new Mat(rect.Height, rect.Width, src.Type(), Scalar.White);
            mask = src * 0;
            roiRect = new Rect(rect.X, rect.Y, rect.Width, rect.Height);
            mask[roiRect] = maskROI;
            Cv2.CvtColor(mask, mask, ColorConversionCodes.BGR2GRAY);
            if (pictureBox2.Image != null)
            {
                pictureBox2.Image.Dispose();
            }
            pictureBox2.Image = BitmapConverter.ToBitmap(mask);
        }

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

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

        InpaintMethod inpaintMethod;
        String CommandText = "";

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

            if (rect == null || (rect.Width == 0 && rect.Height == 0))
            {
                return;
            }

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

            CommandText = String.Format("Cv2.Inpaint(src, mask, dst,{0},{1})", trackBar1.Value, inpaintMethod.ToString());
            txtCommandText.Text = CommandText;

            Cv2.Inpaint(src, mask, dst, trackBar1.Value, inpaintMethod);
            if (pictureBox3.Image != null)
            {
                pictureBox2.Image.Dispose();
            }
            pictureBox3.Image = BitmapConverter.ToBitmap(dst);
        }

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

    }
}

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;
        }
    }
}

9b8c00518bac74281f860258bae582a6.gif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值