卷积边缘问题: 在做卷积处理时,图片的边缘经常不能进行处理,因为锚点无法覆盖每个边缘像素点,处理这种问题的一个有效的办法就是 边缘填补。 边界处理方法:在卷积开始之前增加边缘像素,填充的像素值为0或者RGB黑色,比如3x3在四周各填充1个像素的边缘,这样就确保图像的边缘被处理,在卷积处理之后再去掉这些边缘。
//对于C++ BORDER_DEFAULT :将最近的像素进行映射 BORDER_CONSTANT :用指定的像素填充边缘 BORDER_REPLICATE :复制最近的一行或一列像素并一直延伸至添加边缘的宽度或高度 BORDER_WRAP :用对面的像素值填充边缘 //对用于Csharp BorderTypes.Default :将最近的像素进行映射 BorderTypes.Constant:用指定的像素填充边缘 BorderTypes.Replicate:复制最近的一行或一列像素并一直延伸至添加边缘的宽度或高度 BorderTypes.Wrap:用对面的像素值填充边缘 // // 摘要: // Forms a border around the image // // 参数: // src: // The source image // // dst: // The destination image; will have the same type as src and the size Size(src.cols+left+right, // src.rows+top+bottom) // // top: 顶部需要的指定的像素数 // Specify how much pixels in each direction from the source image rectangle one // needs to extrapolate // // bottom: // Specify how much pixels in each direction from the source image rectangle one // needs to extrapolate // // left: // Specify how much pixels in each direction from the source image rectangle one // needs to extrapolate // // right: // Specify how much pixels in each direction from the source image rectangle one // needs to extrapolate // // borderType: // The border type 边界类型 // // value: // The border value if borderType == Constant 边界类型是常数 public static void CopyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, int right, BorderTypes borderType, Scalar? value = null);实现
//指定每个方向需要的像素 int top = (int)(0.05 * srt.Rows); int bottom = (int)(0.05 * srt.Rows); int left = (int)(0.05 * srt.Cols); int right = (int)(0.05 * srt.Cols); //默认填充颜色,图1 Cv2.CopyMakeBorder(srt,dst,top,bottom,left,right,BorderTypes.Constant); //指定填充的颜色,图2 Scalar pColor = new Scalar(0,255,0); Cv2.CopyMakeBorder(srt,dst,top,bottom,left,right,BorderTypes.Constant,pColor);四种填充方式对比图: BorderTypes.Default :将最近的像素进行映射 BorderTypes.Constant:用指定的像素填充边缘,可以指定填充颜色 BorderTypes.Replicate:复制最近的一行或一列像素并一直延伸至添加边缘的宽度或高度 BorderTypes.Wrap:用对面的像素值填充边缘
