根据百度以及实际操作,发现掩膜操作是增加图片的对比度
方法 Cv2.Filter2D()有7个参数,如下
image.png

  1. static void Main(string[] args)
  2. {
  3. string imangPath = @"I:\OpenCvSharp学习\4.jpg";
  4. Mat redMat = new Mat(imangPath, ImreadModes.AnyColor);//读取图像
  5. if (redMat.Data==null)
  6. {
  7. Console.WriteLine("读取错误");
  8. return;
  9. }
  10. Window loadWindpw = new Window("Input",WindowMode.AutoSize, redMat);
  11. Mat newMat = new Mat();
  12. //定义2D掩膜
  13. //以下是关键,没太搞清楚,万能的大神的答案(kernel )
  14. InputArray kernel = InputArray.Create<int>(new int[3, 3] { { 0, -1, 0 }, { -1, 5, -1 }, { 0, -1, 0 } });
  15. //掩膜操作,提高对比度
  16. Cv2.Filter2D(redMat, newMat, -1, kernel, new Point(-1, 1), 0, BorderTypes.Default);
  17. Window newWindpw = new Window("Output", WindowMode.AutoSize, newMat);
  18. Cv2.WaitKey(0);
  19. }

image.png

反转单通道像素值(将彩色图转为灰度图然后在反转像素)

  1. //单通道像素反转,先把图像转为灰色的单通道图,然后再用255-当前像素值
  2. Mat GrayMat = new Mat();
  3. Cv2.CvtColor(ModifyMat, GrayMat, ColorConversionCodes.BGRA2GRAY);
  4. Mat ReverseMat = new Mat();
  5. GrayMat.CopyTo(ReverseMat);
  6. for (int i = 0; i < ReverseMat.Rows; i++)
  7. {
  8. for (int j = 0; j < ReverseMat.Cols; j++)
  9. {
  10. byte Pixel=ReverseMat.At<byte>(i, j);//获得该点的像素值
  11. Pixel = (byte)(255 - Pixel);
  12. ReverseMat.Set(i, j, Pixel);
  13. }
  14. }
  15. Window OutWindows4 = new Window("GrayMat", WindowMode.AutoSize, GrayMat);
  16. Window OutWindows5 = new Window("ReverseMat", WindowMode.AutoSize, ReverseMat);

image.png

三通道像素反转

  1. //多通道像素反转
  2. Mat Mat3CHModify = new Mat();
  3. ModifyMat.CopyTo(Mat3CHModify);
  4. for (int i = 0; i < Mat3CHModify.Rows; i++)
  5. {
  6. for (int j = 0; j < Mat3CHModify.Cols; j++)
  7. {
  8. Vec3b vec = new Vec3b();
  9. vec.Item0 = (byte)(255 - (Mat3CHModify.At<Vec3b>(i, j)[0]));
  10. vec.Item1 = (byte)(255 - (Mat3CHModify.At<Vec3b>(i, j)[1]));
  11. vec.Item2 = (byte)(255 - (Mat3CHModify.At<Vec3b>(i, j)[2]));
  12. Mat3CHModify.Set<Vec3b>(i, j, vec);
  13. }
  14. }
  15. Window OutWindows5 = new Window("Mat3CHModify", WindowMode.AutoSize, Mat3CHModify);

image.png

上面写了那么多反转像素的,其实OpenCvSharp提供了反转像素的API

Cv2.BitwiseNot(src, dst); //反转像素函数**

不需要挨个的去操作每一个像素了,直接去调用它吧
在图片输出的时候也能做到反转,就是在输出的图片前面加上”~”取反符号就行了

  1. Window OutWindows5 = new Window("Mat3CHModify", WindowMode.AutoSize, ~Mat3CHModify);**