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

news/2024/7/21 6:25:12 标签: 图像处理, c++, opencv

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

1. 图像平滑

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

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

#include <opencv2/opencv.hpp>

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;
}

2. 图像增强

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

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

#include <opencv2/opencv.hpp>

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;
}

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

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

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

3. 图像边缘检测

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

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

#include <opencv2/opencv.hpp>

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;
}

4. 图像阈值化

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

#include <opencv2/opencv.hpp>

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;
}

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

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

5. 图像细化

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

#include <opencv2/opencv.hpp>

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;
}

6. 面积测量

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

#include <opencv2/opencv.hpp>

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;
}

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

总结:

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

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


http://www.niftyadmin.cn/n/5046090.html

相关文章

《2023新版前端Web开发HTML5+CSS3+移动web视频教程,前端web入门首选黑马程序员》学习笔记总目录

本文是对《黑马程序员新版大数据入门到实战教程》所有知识点的笔记进行总结分类。 学习视频&#xff1a;黑马程序员新版前端视频 学习时总结的学习笔记以及思维导图会在后续更新&#xff0c;请敬请期待。 ———————————————————基 础 篇—————————…

OpenCV之cvtColor颜色空间转换

大多数彩色图片都是RGB类型&#xff0c;但是在进行图像处理时&#xff0c;需要用到灰度图、二值图、HSV、HSI等颜色制式&#xff0c;opencv提供了cvtColor()函数来实现这些功能。首先看一下cvtColor函数定义&#xff1a; C: void cvtColor(InputArray src, OutputArray dst, in…

GitLab CI/CD:.gitlab-ci.yml 文件常用参数小结

文章目录 一、.gitlab-ci.yml 文件作用二、一个简单的.gitlab-ci.yml 文件示例参考 一、.gitlab-ci.yml 文件作用 可以定义跑CI时想要运行的命令或脚本 可以定义job之间的依赖和缓存 可以执行程序部署并定义部署位置 可以定义想要包含的其他配置文件和模版 二、一个简单的.gi…

如何学习51单片机

学习51单片机可以按照以下步骤进行&#xff1a; 学习数字电路基础。51单片机是一种嵌入式系统&#xff0c;需要结合数字电路基础进行学习。了解数字电路的基本知识&#xff0c;如逻辑门电路、触发器、寄存器、译码器等&#xff0c;可以帮助你更好地理解51单片机的硬件结构和功…

【通信误码】python实现-附ChatGPT解析

1.题目 通信误码 时间限制: 1s 空间限制: 32MB 限定语言: 不限 题目描述: 信号传播过程中会出现一些误码,不同的数字表示不同的误码ID, 取值范围为1~65535,用一个数组“记录误码出现的情况。 每个误码出现的次数代表误码频度, 请找出记录中包含频度最高误码的最小子数组长度…

容器管理工具 Docker生态架构及部署

目录 一、Docker生态架构 1.1 Docker Containers Are Everywhere 1.2 生态架构 1.2.1 Docker Host 1.2.2 Docker daemon 1.2.3 Registry 1.2.4 Docker client 1.2.5 Image 1.2.6 Container 1.2.7 Docker Dashboard 1.3 Docker版本 二、Docker部署 2.1 使用YUM源部署…

解决一个mybatisplus left join里有ur报错问题

今天调试没有注意写了下面语句 selectsns.send_id,sns.notice_id,sns.user_id,sns.read_flag,sa.notice_title as notice_title,sa.notice_content as notice_content,sa.sender as sender,sa.priority as priority,sa.notice_type as notice_type,sa.send_time as send_timef…

Spring Boot DevTools,实现自动应用重启、自动刷新浏览器以及静态资源热加载等功能

Spring Boot DevTools&#xff0c;可以实现自动应用重启、自动刷新浏览器以及静态资源热加载等功能。 要使用 Spring Boot DevTools&#xff0c;需要进行以下步骤&#xff1a; 在 pom.xml 文件中添加依赖&#xff1a; <dependency><groupId>org.springframework.…