|
针对文字边缘锯齿问题,我建议添加边缘保护机制。以下是修改方案:
方案一:使用形态学膨胀保护黑色区域
在加网处理前,先对黑色区域进行膨胀,保护文字边缘:
- #include <opencv2/opencv.hpp>
- #include <cmath>
- const double PI = 3.141592653589793;
- void createCircularDotScreen(cv::Mat& dst, const cv::Mat& src, double angle_deg, double lpi) {
- double angle_rad = angle_deg * PI / 180.0;
- double dpi = 96.0;
- double spacing = dpi / lpi;
-
- dst.create(src.size(), CV_8UC1);
- cv::Point2f center(src.cols / 2.0f, src.rows / 2.0f);
- // 创建黑色区域掩膜
- cv::Mat blackMask;
- cv::threshold(src, blackMask, 242, 255, cv::THRESH_BINARY_INV); // 95%以上为黑色
-
- // 对黑色区域进行膨胀,保护边缘
- cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
- cv::dilate(blackMask, blackMask, kernel); // 膨胀1-2像素
- for (int y = 0; y < src.rows; ++y) {
- for (int x = 0; x < src.cols; ++x) {
- // 如果属于黑色区域或其边缘,直接设为黑色
- if (blackMask.at<uchar>(y, x) > 0) {
- dst.at<uchar>(y, x) = 0;
- continue;
- }
-
- // 获取原图像素值
- uchar pixel = src.at<uchar>(y, x);
-
- // 坐标平移至中心
- float x_rel = x - center.x;
- float y_rel = y - center.y;
- // 倾斜变换
- float x_rot = x_rel * cos(angle_rad) - y_rel * sin(angle_rad);
- float y_rot = x_rel * sin(angle_rad) + y_rel * cos(angle_rad);
- // 计算网点中心位置
- float x_center = round(x_rot / spacing) * spacing;
- float y_center = round(y_rot / spacing) * spacing;
- // 计算当前点到网点的距离
- float distance = sqrt(pow(x_rot - x_center, 2) + pow(y_rot - y_center, 2));
-
- // 根据灰度值动态调整半径
- float maxRadius = spacing / 2.0;
- float radius = maxRadius * (1.0 - pixel / 255.0);
- // 判断是否在网点内
- if (distance <= radius) {
- dst.at<uchar>(y, x) = 0; // 黑色网点
- } else {
- dst.at<uchar>(y, x) = 255; // 白色背景
- }
- }
- }
- }
复制代码
方案二:添加边缘检测保护
更精确地检测文字边缘并保护:
- // 在方案一基础上添加边缘检测
- cv::Mat edges;
- cv::Canny(src, edges, 50, 150); // 检测边缘
- // 合并黑色区域和边缘
- cv::bitwise_or(blackMask, edges, blackMask);
- // 对合并后的掩膜进行膨胀
- cv::dilate(blackMask, blackMask, kernel);
复制代码
关键改进点:
- 使用 cv::threshold 创建黑色区域掩膜
- 通过 cv::dilate 膨胀1-2像素保护边缘
- 在循环中优先检查掩膜,属于保护区域的直接设为黑色
这样修改后,文字边缘的浅色像素也会被识别为黑色区域的一部分,从而避免产生锯齿状的网点。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|