|
发表于 2024-12-9 10:03:14
|
显示全部楼层
在您的代码中,有几个问题可能导致实现没有达到预期效果。以下是您需要注意的地方:
1. **像素访问方式错误**:在OpenCV中,`img.at<uchar>(y, x)` 应该用来访问单通道(灰度图像)的像素值,而不是 `img.at(x, y)`。
2. **条件判断顺序**:对x轴和y轴的检测,您把设置像素的条件放在一个block中。如果一个条件为真,后面的条件就不会被检测。因此,您可能需要对这些条件分开处理。
以下是修正后的改进代码:
- void processImage(Mat& img) {
- // 遍历图像的每个像素(不包括边缘像素,因为它们没有足够的邻居)
- for (int y = 2; y < img.rows - 2; ++y) {
- for (int x = 2; x < img.cols - 2; ++x) {
- // 获取当前像素值
- uchar currentValue = img.at<uchar>(y, x);
- // 如果当前像素为白色(假设白色为255)
- if (currentValue == 255) {
- // 检测x轴前面第2和第3像素
- uchar xFront2Value = img.at<uchar>(y, x - 2);
- uchar xFront3Value = img.at<uchar>(y, x - 3);
- // 设置前面1像素
- if (xFront2Value == 0 && xFront3Value == 0) {
- img.at<uchar>(y, x - 1) = 255;
- } else if (xFront2Value == xFront3Value && xFront2Value != 0) {
- img.at<uchar>(y, x - 1) = xFront2Value;
- }
- // 检测x轴后面第2和第3像素
- uchar xAfter2Value = img.at<uchar>(y, x + 2);
- uchar xAfter3Value = img.at<uchar>(y, x + 3);
- // 设置后面1像素
- if (xAfter2Value == 0 && xAfter3Value == 0) {
- img.at<uchar>(y, x + 1) = 255;
- } else if (xAfter2Value == xAfter3Value && xAfter2Value != 0) {
- img.at<uchar>(y, x + 1) = xAfter2Value;
- }
- // 检测y轴上面第2和第3像素
- uchar yUp2Value = img.at<uchar>(y - 2, x);
- uchar yUp3Value = img.at<uchar>(y - 3, x);
- // 设置上面1像素
- if (yUp2Value == 0 && yUp3Value == 0) {
- img.at<uchar>(y - 1, x) = 255;
- } else if (yUp2Value == yUp3Value && yUp2Value != 0) {
- img.at<uchar>(y - 1, x) = yUp2Value;
- }
- // 检测y轴下面第2和第3像素
- uchar yDown2Value = img.at<uchar>(y + 2, x);
- uchar yDown3Value = img.at<uchar>(y + 3, x);
- // 设置下面1像素
- if (yDown2Value == 0 && yDown3Value == 0) {
- img.at<uchar>(y + 1, x) = 255;
- } else if (yDown2Value == yDown3Value && yDown2Value != 0) {
- img.at<uchar>(y + 1, x) = yDown2Value;
- }
- }
- }
- }
- }
复制代码
以上代码将对像素的访问方式进行了正确处理,并分隔了x轴和y轴的条件判断,以确保其独立运行。希望这样可以解决您遇到的问题。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|