|
发表于 2024-12-5 15:57:17
|
显示全部楼层
要实现网点在遇到白色区域时停止绘制,可以通过在绘制网点之前检查网点的边缘是否与白色区域重叠,并在重叠时裁剪网点。以下是一个改进的实现思路:
1. **检测白色区域**:在绘制网点之前,检查网点所在区域是否包含白色像素。
2. **裁剪网点**:如果网点边缘与白色区域重叠,则只在非白色区域绘制网点。
以下是如何在代码中实现这一逻辑的示例:
- #include <opencv2/opencv.hpp>
- using namespace cv;
- void ConvertToHalftone(const Mat &src, Mat &dst, int lpi) {
- Mat gray;
- cvtColor(src, gray, COLOR_BGR2GRAY);
- dst = Mat::ones(gray.size(), gray.type()) * 255;
- int dotSize = cvRound(25.4 / lpi);
- double maxRadius = dotSize / 2.0;
- for (int y = 0; y < gray.rows; y += dotSize) {
- for (int x = 0; x < gray.cols; x += dotSize) {
- Rect block(x, y, dotSize, dotSize);
- if (x + dotSize > gray.cols || y + dotSize > gray.rows)
- continue;
- Mat roi = gray(block);
- Scalar averageIntensity = mean(roi);
- double intensity = averageIntensity.val[0];
- if (intensity > 2 && intensity < 253) {
- double scaleFactor = (253 - intensity) / 251.0;
- double radius = scaleFactor * maxRadius;
- if (radius > 0) {
- Point center(cvRound(x + dotSize / 2), cvRound(y + dotSize / 2));
- // Create a mask for the circle
- Mat mask = Mat::zeros(dst.size(), CV_8UC1);
- circle(mask, center, cvRound(radius), Scalar(255), -1, LINE_AA);
- // Check for white areas in the original image
- Mat whiteArea;
- inRange(src(block), Scalar(240, 240, 240), Scalar(255, 255, 255), whiteArea);
- // Invert the white area mask
- bitwise_not(whiteArea, whiteArea);
- // Apply the mask to the circle
- bitwise_and(mask(block), whiteArea, mask(block));
- // Draw the circle on the destination image
- dst.setTo(Scalar(0), mask);
- }
- } else {
- rectangle(dst, block, Scalar(intensity), FILLED);
- }
- }
- }
- }
- int main() {
- Mat img = imread("your_image_path.jpg");
- if (img.empty()) {
- printf("Error: Cannot load image
- ");
- return -1;
- }
- Mat halftoneImg;
- ConvertToHalftone(img, halftoneImg, 50);
- imshow("Halftone", halftoneImg);
- waitKey(0);
- return 0;
- }
复制代码
**关键点:**
- 使用`inRange`函数检测白色区域。
- 使用`bitwise_and`函数将白色区域的掩码应用于网点,以确保网点不会覆盖白色区域。
- 通过这种方式,网点将被裁剪以适应白色区域,从而避免侵蚀白色文字或线条。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|