青少年编程与数学 02-018 C++数据结构与算法 25课题、图像处理算法

青少年编程与数学 02-018 C++数据结构与算法 25课题、图像处理算法

课题摘要:

本文是对一些常见图像处理算法的详解,包括原理、应用场景、优缺点及代码示例。


一、图像增强与复原

1. 直方图均衡化

原理 :通过调整图像的直方图分布,使输出图像的直方图均匀分布,从而增强图像的对比度。对于灰度图像,计算每个灰度级的像素数量,然后通过累积分布函数调整像素值。
应用场景 :适用于图像整体偏暗或偏亮的情况,能够有效增强图像的全局对比度。
优缺点

优点:简单高效,能显著增强图像对比度。

缺点 :可能会放大噪声,对局部对比度提升有限。
代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // 读取图像
    Mat img = imread("example.jpg", IMREAD_GRAYSCALE);
    if (img.empty()) {
        std::cerr << "无法加载图像" << std::endl;
        return -1;
    }

    // 直方图均衡化
    Mat equ;
    equalizeHist(img, equ);

    // 显示结果
    imshow("Original", img);
    imshow("Equalized", equ);
    waitKey(0);
    return 0;
}

2. 对比度受限的自适应直方图均衡化(CLAHE)

原理 :在直方图均衡化的基础上,限制直方图的最大值,避免过度增强噪声。
应用场景 :适用于图像存在局部区域对比度差异较大的情况。
优缺点

优点:能有效减少噪声,增强局部对比度。

缺点 :计算复杂度较高,处理时间较长。
代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // 读取图像
    Mat img = imread("example.jpg", IMREAD_GRAYSCALE);
    if (img.empty()) {
        std::cerr << "无法加载图像" << std::endl;
        return -1;
    }

    // 创建CLAHE对象
    Ptr<CLAHE> clahe = createCLAHE(2.0, Size(8, 8));
    Mat clahe_img;
    clahe->apply(img, clahe_img);

    // 显示结果
    imshow("CLAHE", clahe_img);
    waitKey(0);
    return 0;
}

二、图像滤波与边缘检测

1. 高斯滤波

原理 :通过高斯函数对图像进行平滑处理,减少噪声。高斯滤波器的权重由高斯函数决定,中心像素的权重最大。
应用场景 :广泛用于图像去噪,平滑图像。
优缺点

优点:能有效去除高斯噪声,平滑效果好。

缺点 :可能会模糊图像细节。
代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // 读取图像
    Mat img = imread("example.jpg", IMREAD_GRAYSCALE);
    if (img.empty()) {
        std::cerr << "无法加载图像" << std::endl;
        return -1;
    }

    // 高斯滤波
    Mat blurred_img;
    GaussianBlur(img, blurred_img, Size(5, 5), 0);

    // 显示结果
    imshow("Blurred", blurred_img);
    waitKey(0);
    return 0;
}

2. Canny边缘检测

原理 :通过高斯模糊、梯度计算、非极大值抑制和双阈值检测等步骤,精确检测图像边缘。
应用场景 :用于图像边缘提取,广泛应用于计算机视觉任务。
优缺点

优点:边缘检测效果好,能有效去除噪声。

缺点 :参数选择较为复杂,计算量较大。
代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // 读取图像
    Mat img = imread("example.jpg", IMREAD_GRAYSCALE);
    if (img.empty()) {
        std::cerr << "无法加载图像" << std::endl;
        return -1;
    }

    // Canny边缘检测
    Mat edges;
    Canny(img, edges, 100, 200);

    // 显示结果
    imshow("Edges", edges);
    waitKey(0);
    return 0;
}

三、图像分割与形态学操作

1. 形态学操作

原理 :基于图像的几何结构进行处理,包括腐蚀、膨胀、开运算、闭运算等。
应用场景 :用于去除噪声、填补小孔、连接断开的部分等。
优缺点

优点:操作简单,效果直观。

缺点 :对结构元素的选择较为敏感,可能改变图像的形状。
代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // 读取图像
    Mat img = imread("example.jpg", IMREAD_GRAYSCALE);
    if (img.empty()) {
        std::cerr << "无法加载图像" << std::endl;
        return -1;
    }

    // 创建结构元素
    Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));

    // 腐蚀
    Mat erosion;
    erode(img, erosion, kernel, Point(-1, -1), 1);

    // 膨胀
    Mat dilation;
    dilate(img, dilation, kernel, Point(-1, -1), 1);

    // 显示结果
    imshow("Erosion", erosion);
    imshow("Dilation", dilation);
    waitKey(0);
    return 0;
}

四、图像特征提取与几何变换

1. SIFT特征提取

原理 :通过检测图像中的尺度不变特征点,提取特征描述符。SIFT算法对旋转、尺度变化和光照变化具有良好的不变性。
应用场景 :广泛用于图像匹配、目标识别和三维重建等。
优缺点

优点:特征稳定,抗干扰能力强。

缺点 :计算复杂度高,速度较慢。
代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
using namespace cv;
using namespace cv::xfeatures2d;

int main() {
    // 读取图像
    Mat img = imread("example.jpg", IMREAD_GRAYSCALE);
    if (img.empty()) {
        std::cerr << "无法加载图像" << std::endl;
        return -1;
    }

    // 创建SIFT对象
    Ptr<SIFT> sift = SIFT::create();
    vector<KeyPoint> kp;
    Mat des;

    // 检测和计算特征
    sift->detectAndCompute(img, noArray(), kp, des);

    // 绘制特征点
    Mat img_sift;
    drawKeypoints(img, kp, img_sift);

    // 显示结果
    imshow("SIFT", img_sift);
    waitKey(0);
    return 0;
}

2. 仿射变换与透视变换

原理 :通过计算图像之间的几何变换矩阵,对图像进行平移、旋转、缩放等操作。
应用场景 :用于图像配准、目标检测和三维重建等。
优缺点

优点:变换效果好,能处理复杂的几何变换。

缺点 :需要准确的特征点匹配,计算复杂度较高。
代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // 读取图像
    Mat img = imread("example.jpg");
    if (img.empty()) {
        std::cerr << "无法加载图像" << std::endl;
        return -1;
    }

    // 获取图像尺寸
    int rows = img.rows;
    int cols = img.cols;

    // 计算旋转矩阵
    Mat M_affine = getRotationMatrix2D(Point(cols / 2, rows / 2), 45, 1);

    // 进行仿射变换
    Mat affine_img;
    warpAffine(img, affine_img, M_affine, Size(cols, rows));

    // 显示结果
    imshow("Affine", affine_img);
    waitKey(0);
    return 0;
}

五、图像压缩

JPEG压缩

原理 :通过离散余弦变换(DCT)、量化和霍夫曼编码等步骤,对图像进行有损压缩。
应用场景 :广泛用于静态图像的存储和传输。
优缺点

优点:压缩比高,图像质量较好。

缺点 :有损压缩,可能会丢失部分细节。
代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // 读取图像
    Mat img = imread("example.jpg");
    if (img.empty()) {
        std::cerr << "无法加载图像" << std::endl;
        return -1;
    }

    // 保存为JPEG格式
    imwrite("compressed.jpg", img, vector<int>{IMWRITE_JPEG_QUALITY, 50});
    return 0;
}
相关推荐
Kidddddult44 分钟前
力扣刷题Day 43:矩阵置零(73)
算法·leetcode·力扣
大龄Python青年3 小时前
C语言 交换算法之加减法,及溢出防范
c语言·开发语言·算法
左直拳3 小时前
c++中“&”符号代表引用还是取内存地址?
开发语言·c++·指针·引用·右值·取内存地址
啊我不会诶3 小时前
CF每日5题
算法
十年编程老舅3 小时前
二本计算机,毕业=失业?
c++·程序员·编程·秋招·c++项目·春招·qt项目
虾球xz4 小时前
游戏引擎学习第260天:在性能分析器中实现钻取功能
网络·c++·学习·游戏引擎
Yusei_05234 小时前
C++复习类与对象基础
c++
朱剑君4 小时前
排序算法——基数排序
算法·排序算法
COOCC14 小时前
PyTorch 实战:从 0 开始搭建 Transformer
人工智能·pytorch·python·深度学习·算法·机器学习·transformer
拾忆-eleven5 小时前
C++算法(19):整数类型极值,从INT_MIN原理到跨平台开发实战
数据结构·c++·算法