• 图像处理入门:从平滑到面积测量的C++实践指南


    第一部分:图像平滑与增强

    1. 图像平滑

    图像平滑,也称为图像模糊,是图像处理中常见的预处理步骤,用于去除图像中的噪声。常见的平滑方法有均值滤波、高斯滤波等。

    均值滤波: 均值滤波是将图像中的每个像素值替换为其邻域内像素值的平均值。这有助于消除小的噪声。

    #include 
    
    void meanFilter(const cv::Mat& src, cv::Mat& dst, int ksize) {
        cv::blur(src, dst, cv::Size(ksize, ksize));
    }
    
    int main() {
        cv::Mat src = cv::imread("path_to_image.jpg");
        cv::Mat dst;
        meanFilter(src, dst, 3);
        cv::imwrite("smoothed_image.jpg", dst);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2. 图像增强

    图像增强的目的是提高图像的视觉效果或突出某些特征。常见的增强方法有直方图均衡化、对比度增强等。

    直方图均衡化: 直方图均衡化是一种提高图像对比度的方法,它通过重新分配像素的强度值来平均分布整个强度范围。

    #include 
    
    void histogramEqualization(const cv::Mat& src, cv::Mat& dst) {
        cv::cvtColor(src, dst, cv::COLOR_BGR2GRAY);
        cv::equalizeHist(dst, dst);
    }
    
    int main() {
        cv::Mat src = cv::imread("path_to_image.jpg");
        cv::Mat dst;
        histogramEqualization(src, dst);
        cv::imwrite("enhanced_image.jpg", dst);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这两个简单的C++示例使用了OpenCV库,一个广泛使用的计算机视觉库,来实现图像平滑和增强。在实际应用中,你可能需要根据具体的需求和场景调整参数和方法。

    注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。为了获得完整的项目和更多的优化技巧,请下载完整项目

    第二部分:图像边缘检测与图像阈值化

    3. 图像边缘检测

    边缘检测是图像处理中的关键步骤,用于识别图像中的物体边界。常见的边缘检测算法有Sobel、Canny等。

    Sobel边缘检测: Sobel算法使用水平和垂直方向的卷积核来计算图像的梯度强度和方向,从而检测边缘。

    #include 
    
    void sobelEdgeDetection(const cv::Mat& src, cv::Mat& dst) {
        cv::Mat grad_x, grad_y;
        cv::Sobel(src, grad_x, CV_16S, 1, 0, 3);
        cv::Sobel(src, grad_y, CV_16S, 0, 1, 3);
        cv::convertScaleAbs(grad_x, grad_x);
        cv::convertScaleAbs(grad_y, grad_y);
        cv::addWeighted(grad_x, 0.5, grad_y, 0.5, 0, dst);
    }
    
    int main() {
        cv::Mat src = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE);
        cv::Mat dst;
        sobelEdgeDetection(src, dst);
        cv::imwrite("sobel_edges.jpg", dst);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4. 图像阈值化

    图像阈值化是将图像分割为前景和背景的简单方法。通过为图像设置一个阈值,我们可以将像素值高于或低于该阈值的像素分类为前景或背景。

    #include 
    
    void thresholding(const cv::Mat& src, cv::Mat& dst, int thresholdValue) {
        cv::threshold(src, dst, thresholdValue, 255, cv::THRESH_BINARY);
    }
    
    int main() {
        cv::Mat src = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE);
        cv::Mat dst;
        thresholding(src, dst, 127);
        cv::imwrite("thresholded_image.jpg", dst);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这两个示例中,我们使用了OpenCV库来实现Sobel边缘检测和简单的阈值化。这些方法在图像处理中非常常见,但它们只是众多可用方法中的一部分。

    第三部分:图像细化与面积测量

    5. 图像细化

    图像细化是一个过程,旨在减少图像中物体的宽度,直到它们变为单像素宽度的线条。这对于骨架化或提取图像中的主要特征线条非常有用。

    #include 
    
    void thinning(const cv::Mat& src, cv::Mat& dst) {
        dst = src.clone();
        cv::ximgproc::thinning(src, dst);
    }
    
    int main() {
        cv::Mat src = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE);
        cv::Mat dst;
        thinning(src, dst);
        cv::imwrite("thinned_image.jpg", dst);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    6. 面积测量

    在图像处理中,经常需要测量图像中物体的面积。这可以通过计算前景像素的数量来实现。

    #include 
    
    double measureArea(const cv::Mat& binaryImage) {
        return cv::countNonZero(binaryImage);
    }
    
    int main() {
        cv::Mat src = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE);
        cv::Mat thresholded;
        cv::threshold(src, thresholded, 127, 255, cv::THRESH_BINARY);
        double area = measureArea(thresholded);
        std::cout << "Measured Area: " << area << " pixels" << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这个示例中,我们首先对图像进行阈值化,然后计算非零像素的数量,这代表了物体的面积。

    总结:

    图像处理是一个广泛且复杂的领域,涉及多种技术和算法。在这篇文章中,我们简要介绍了六种常见的图像处理技术,并提供了C++和OpenCV的实现示例。这些示例为初学者提供了一个良好的起点,但在实际应用中,可能需要进一步的调整和优化。

    注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。为了获得完整的项目和更多的优化技巧,请下载完整项目

  • 相关阅读:
    AIGC笔记--Maya提取和修改FBX动作文件
    华为2023鲲鹏应用创新大赛,实在智能“信创RPA”再获殊荣
    Windows OpenGL 图像伽马线
    Django笔记二十八之数据库查询优化汇总
    docker架构
    Shell速成:快速提升你的Linux命令行技能
    Biotin-PEG-NHS 生物素PEG活性酯
    MySQL数据库增删改查
    装修服务预约小程序的内容如何
    前端开发是做什么的?工作职责
  • 原文地址:https://blog.csdn.net/m0_57781768/article/details/133208226