C# OpenCvSharp实现去除文字中的线条
作者:天天代码码天天
这篇文章主要为大家详细介绍了C#如何使用OpenCvSharp实现去除文字中的线条效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
效果
处理步骤
1、Cv2.Resize图片放大
2、Cv2.CvtColor转灰度图
3、Cv2.Threshold二值化
4、Cv2.HoughLinesP找直线
5、利用找出的直线制作一个mask图
6、Cv2.Inpaint+制作的mask图进行图像修补
7、逐像素处理文字边缘的颜色
8、Cv2.BitwiseNot黑白反色
中间过程效果
项目
VS2022
.net framework 4.8
OpenCvSharp 4.8
Microsoft.ML.OnnxRuntime 1.16.2
代码
/// <summary> /// Restores the selected region in an image using the region neighborhood. /// </summary> /// <param name="src">Input 8-bit, 16-bit unsigned or 32-bit float 1-channel or 8-bit 3-channel image.</param> /// <param name="inpaintMask">Inpainting mask, 8-bit 1-channel image. Non-zero pixels indicate the area that needs to be inpainted.</param> /// <param name="dst">Output image with the same size and type as src.</param> /// <param name="inpaintRadius">Radius of a circular neighborhood of each point inpainted that is considered by the algorithm.</param> /// <param name="flags">Inpainting method that could be cv::INPAINT_NS or cv::INPAINT_TELEA</param> public static void Inpaint(InputArray src, InputArray inpaintMask,OutputArray dst, double inpaintRadius, InpaintMethod flags)
using OpenCvSharp; using System; using System.Drawing; using System.Windows.Forms; using static System.Net.Mime.MediaTypeNames; namespace OpenCvSharp_Demo { public partial class frmMain : Form { public frmMain() { InitializeComponent(); } string image_path = ""; private void Form1_Load(object sender, EventArgs e) { image_path = "1.png"; pictureBox1.Image = new Bitmap(image_path); } private void button2_Click(object sender, EventArgs e) { Mat image = new Mat(image_path); Cv2.Resize(image, image, new OpenCvSharp.Size(), 5, 5, InterpolationFlags.Cubic); Cv2.ImShow("image", image); Mat gray = new Mat(); Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY); Cv2.ImShow("gray", gray); Mat binary = new Mat(); Cv2.Threshold(gray, binary, 70, 255, ThresholdTypes.BinaryInv); Cv2.ImShow("binary", binary); LineSegmentPoint[] res = Cv2.HoughLinesP(binary, rho: 1, theta: Math.PI / 180.0, threshold: 100, minLineLength: image.Cols - 50, maxLineGap: 50); //Console.WriteLine("res.Length:" + res.Length); Mat mask = Mat.Zeros(image.Rows, image.Cols, MatType.CV_8UC1); for (int i = 0; i < res.Length; i++) { Scalar color = Scalar.RandomColor(); Cv2.Line(mask, res[i].P1, res[i].P2, color: Scalar.White, thickness: 11, lineType: LineTypes.Link8); } Cv2.ImShow("mask", mask); Mat dst = new Mat(); Cv2.Inpaint(binary, mask, dst, 5, InpaintMethod.Telea); Cv2.ImShow("Inpaint", dst); for (int r = 0; r < dst.Rows; r++) { for (int c = 0; c < dst.Cols; c++) { byte p = dst.At<byte>(r, c); if (p > 50) { dst.Set<byte>(r, c, 255); } else { dst.Set<byte>(r, c, 0); } } } Cv2.ImShow("black background", dst); //黑白反色 Cv2.BitwiseNot(dst, dst); Cv2.ImShow("dst", dst); Cv2.ImWrite("dst.jpg", dst); pictureBox2.Image = new Bitmap(dst.ToMemoryStream()); } } }
以上就是C# OpenCvSharp实现去除文字中的线条的详细内容,更多关于C# OpenCvSharp去除文字中线条的资料请关注脚本之家其它相关文章!