OpenCV倾斜文本图像旋转后保证文本平滑显示问题咨询
倾斜文本图像旋转校正优化方案
需调整的参数与逻辑
- 角度计算逻辑修正
OpenCV中MinAreaRect返回的角度范围为[-90, 0),直接使用易出现旋转方向偏差,导致文本边缘模糊。需新增判断逻辑:若返回角度小于-45°,则将角度值加90°后再传入旋转矩阵计算,保证旋转方向符合文本阅读需求。 - 插值算法优化
当前使用的三次立方插值对文本这类高频边缘的还原效果一般,可替换为InterpolationFlags.Lanczos4,该算法针对文字轮廓的重采样精度更高,旋转后文本边缘更平滑。 - 存储参数调整
当前直接输出JPG格式属于有损压缩,会额外产生边缘锯齿。可改为输出PNG无损格式,若需保留JPG格式,需在写入时指定最高压缩质量,降低压缩损耗。 - 边界填充配置补充
WarpAffine默认边界为黑色填充,易造成文本边缘对比突兀,可新增borderMode参数设置为BorderTypes.Replicate,用边缘像素扩展填充,避免旋转后边缘出现异常色块。
优化后C#代码示例
var src = Cv2.ImRead("NzGFw.png"); var gray = new Mat(); Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY); // 可选:先做高斯模糊去噪,提升角度计算精度 Cv2.GaussianBlur(gray, gray, new Size(3,3), 0); var output = new Mat(); Cv2.BitwiseNot(gray, output); Mat points = new Mat(); Cv2.FindNonZero(output, points); var box = Cv2.MinAreaRect(points); // 修正角度 double angle = box.Angle; if (angle < -45) { angle += 90; } Mat rot = Cv2.GetRotationMatrix2D(box.Center, angle, 1); Mat rotated = new Mat(); // 更换插值算法+补充边界参数 Cv2.WarpAffine(src, rotated, rot, src.Size(), InterpolationFlags.Lanczos4, BorderTypes.Replicate); // 无损输出PNG,或指定JPG最高质量 // Cv2.ImWrite("inclined_text_rotated.jpg", rotated, new ImageWriteParam(ImageWriteFlags.JpegQuality, 100)); Cv2.ImWrite("inclined_text_rotated.png", rotated);
样图参考


内容的提问来源于stack exchange,提问作者Domestos
相关产品推荐
相关产品推荐

