如何使用 OpenCV 和 C++ 识别嘈杂的单色图像中的斑点?

问题描述 投票:0回答:1

我有一张嘈杂的图像,其中有几个亮点,我需要识别和分析。我尝试过使用简单的阈值技术,但噪声水平太高,并且很难准确地隔离斑点。

这是我的图像示例,其中包含我想要识别的斑点:

noisy background with bright spots

我正在使用带有 C++ 的 OpenCV,并且希望获得有关识别这些点的最佳方法的指导。具体来说,我需要帮助:

  1. 预处理图像以减少噪点并增加斑点的可见度。
  2. 识别并隔离亮点。
  3. 勾画出已识别的点。

这是我迄今为止尝试过的:

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image = cv::imread("image.png", cv::IMREAD_GRAYSCALE);
    if (image.empty()) {
        return -1;
    }

    // Thresholding to create a binary image
    cv::Mat binaryImage;
    cv::threshold(image, binaryImage, 200, 255, cv::THRESH_BINARY);

    // Finding contours
    std::vector<std::vector<cv::Point>> contours;
    cv::findContours(binaryImage, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

    // Drawing contours
    cv::Mat outputImage = cv::Mat::zeros(image.size(), CV_8UC3);
    for (size_t i = 0; i < contours.size(); i++) {
        cv::drawContours(outputImage, contours, (int)i, cv::Scalar(0, 0, 255), 2);
    }

    cv::imwrite("output.png", outputImage);
    return 0;
}
c++ opencv image-processing image-segmentation
1个回答
0
投票

尝试腐蚀和膨胀,这是 opencv 中提供的两个图像处理函数。侵蚀可以消除小的白色斑点,并且应该能够比阈值处理更好地消除图像中的噪点。您应该在图像中的亮点处留下一些白色像素。然后,扩张会将斑点放大回原来的大小。

© www.soinside.com 2019 - 2024. All rights reserved.