加载图片

  1. string imangPath = @"I:\OpenCvSharp学习\4.jpg";//原图加载路径
  2. Mat LoadMat = new Mat(imangPath, ImreadModes.AnyColor);
  3. if (LoadMat.Empty())
  4. {
  5. Console.WriteLine("加载错误");
  6. return;
  7. }
  8. Mat ModifyMat = new Mat();
  9. LoadMat.CopyTo(ModifyMat);//Copy图像
  10. Window InputWindows = new Window("Input", WindowMode.Normal, LoadMat);//显示原图

获得每个像素点的值

  1. for (int i = 0; i < ModifyMat.Rows; i++)
  2. {
  3. for (int j = 0; j < ModifyMat.Cols; j++)
  4. {
  5. Vec3b vec = new Vec3b();
  6. vec.Item0 = (byte)ModifyMat.At<Vec3b>(i, j)[0];
  7. vec.Item1 = (byte)ModifyMat.At<Vec3b>(i, j)[1];
  8. vec.Item2 = (byte)ModifyMat.At<Vec3b>(i, j)[2];
  9. Console.WriteLine(vec.Item0.ToString() + ',' + vec.Item1.ToString() + ',' + vec.Item2.ToString());
  10. }
  11. }

07cff5cf-db0e-4321-aa85-ffe69ac562dc.png

将每个像素点都减去一个数,达到降低亮度的目的

  1. Mat ModifyNat1 = new Mat();
  2. ModifyMat.CopyTo(ModifyNat1);
  3. for (int i = 0; i < ModifyMat.Rows; i++)
  4. {
  5. for (int j = 0; j < ModifyMat.Cols; j++)
  6. {
  7. Vec3b vec = new Vec3b();
  8. vec.Item0= (byte)ByteCase((ModifyMat.Get<Vec3b>(i, j).Item0 - 80));
  9. vec.Item1 = (byte)ByteCase((ModifyMat.Get<Vec3b>(i, j).Item1 - 80));
  10. vec.Item2 = (byte)ByteCase((ModifyMat.Get<Vec3b>(i, j).Item2 - 80));
  11. ModifyNat1.Set(i, j, vec);
  12. }
  13. }
  14. Window OutWindows2 = new Window("Output2", WindowMode.Normal, ModifyNat1);

image.png

将每个像素都加上一个数,达到增加亮度的目的

  1. Mat ModifyNat2 = new Mat();
  2. ModifyMat.CopyTo(ModifyNat2);
  3. for (int i = 0; i < ModifyMat.Rows; i++)
  4. {
  5. for (int j = 0; j < ModifyMat.Cols; j++)
  6. {
  7. Vec3b vec = new Vec3b();
  8. vec.Item0 = (byte)ByteCase((ModifyMat.Get<Vec3b>(i, j).Item0 + 40));
  9. vec.Item1 = (byte)ByteCase((ModifyMat.Get<Vec3b>(i, j).Item1 + 40));
  10. vec.Item2 = (byte)ByteCase((ModifyMat.Get<Vec3b>(i, j).Item2 + 40));
  11. ModifyNat2.Set(i, j, vec);
  12. }
  13. }
  14. Window OutWindows3 = new Window("Output3", WindowMode.Normal, ModifyNat2);

image.png

方法ByteCase:

将相素的数值进行加减的时候有超出规格的时候,用以下方法保证数值都在0-255

  1. private static int ByteCase(int n)
  2. {
  3. if (n <= 0)
  4. {
  5. return 0;
  6. }
  7. else if (n > 255)
  8. {
  9. return 255;
  10. }
  11. else
  12. {
  13. return n;
  14. }
  15. }