数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv)

这篇具有很好参考价值的文章主要介绍了数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本系列博客参考书为, 数字图像处理第三版-冈萨雷斯
数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

第三版教材中图片下载地址: book images downloads

vs2019配置opencv可以查看:VS2019 & Opencv4.5.4配置教程

后续剧情:
数字图像处理 第四章 频率域滤波 学习笔记
数字图像处理 第六章 彩色图像处理 学习笔记
数字图像处理 第七章 小波域多分辨率处理 学习笔记
数字图像处理 第九章 形态学图像处理 学习笔记
数字图像处理 第十章 图像分割 学习笔记
数字图像处理 第11章 表示和描述 学习笔记

1. 变换和滤波基础

空间域处理表示为:
g ( x , y ) = T [ f ( x , y ) ] g(x, y)=T[f(x, y)] g(x,y)=T[f(x,y)]
其中f(x, y)是输入图像, g(x, y)是处理后的图像, T是在点(x, y)的邻域上关于f的一中算子.
灰度变换函数: s = T ( r ) s=T(r) s=T(r), 其中r是输入图像任意点的灰度, s表示输出后的灰度.

2. 一些基本的灰度变换函数

2.1 图像反转:

  • s = L − 1 − r s=L-1-r s=L1r
  • 适用于增强嵌入在暗区域中的白色或灰色区域
  • 特别是当黑色面积占主导地位.

opencv中使用到的是bitwise_not函数

void inversionImage(string path) {
    Mat img = imread(path, IMREAD_GRAYSCALE);
    if (img.empty()) {
        cerr << "Could not open or find the image!" << std::endl;
        return;
    }
    Mat in_img;
    bitwise_not(img, in_img);    //图像反转操作, 对应课本的式(3.2-1)

    Mat com_img;
    hconcat(img, in_img, com_img);    //拼接图像

    imshow("Inverted Gray Image", com_img); //输出拼接图像
    waitKey(0);
}

运行结果如下:
数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

2.2 对数变换:

  • s = c l o g ( 1 + r ) s=clog(1+r) s=clog(1+r)

  • 完成图像灰度级的扩展或压缩

  • 作用于图像的傅里叶频谱, 会丰富细节

opencv中使用add函数和log函数实现

Mat logTransform(Mat input, int c) {
    //add(input, Scalar(1.0), input);
    input.convertTo(input, CV_32F);

    Mat result;
    log(1.0 + input, result);    //默认以10为底
    //归一化到0-255范围
    normalize(result, result, 0, 255, NORM_MINMAX);
    result = c * result;
    result.convertTo(result, CV_8U);
    return result;
}

数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

2.3 幂律变换:

  • s = c r γ s=cr^{γ} s=crγ
  • 部分γ值的幂律曲线将较窄范围的暗色输入值映射为较宽范围
  • 用于"伽马校正".
  • 进行对比度增强: 1)对于整体偏暗的图像, 选择伽马值小于1的来完成变换; 2)而对于遭到"冲淡"的图像, 伽马值选择大于1的值.
Mat gammaTransform(Mat input, float gamma, int c) {

    input.convertTo(input, CV_32F);
    Mat result;
    pow(input / 255.0, gamma, result);

    result = c * result;

    normalize(result, result, 0, 255, NORM_MINMAX);
    result.convertTo(result, CV_8U);    //转成uint8格式, 合并操作需要俩图片数据类型一样

    return result;
}

左图, gamma选择0.4, 右图gamma选择4.1; c均选择为1
数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

2.4 分段线性变换函数:

  • 对比度拉伸:
  • 灰度级分层:
  • 比特平面分层:
// layerNum的取值范围为1~8
Mat layerTransform(Mat input, uchar layerNum) {
    Mat result;
    uchar bits = 1 << (layerNum - 1);
    result = input & bits;
    result = result * 255;
    return result;
}

数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv
重构也很简单

Mat layer6 = img & 32;
Mat layer7 = img & 64;
Mat layer8 = img & 128;
Mat reconstract = (layer6 + layer7 + layer8);
imshow("layer6+7+8", reconstract);
waitKey(0);

数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

3. 直方图处理

直方图用离散函数表示: p ( r k ) = n k / M N p(r_{k})=n_{k}/MN p(rk)=nk/MN, 其中rk表示第k级灰度值, nk表示图像中灰度为rk的像素个数.
注意: 均值是平均灰度的度量, 方差(或标准差)是图像对比度的度量. 得到直方图, 就能求出这俩个计算的值.

3.1 直方图均衡化

均质化是直方图匹配的一种特殊情况, 对图像重新分配像素值, 使一定范围内的像素值数量大致相同.
优点: 适用于背景和前景都太暗或太亮的图像, 以及曝光过度或曝光不足的图像.
缺点: 可能会增加背景噪声的对比度并且降低有用信号的对比度, 导致对比度过分增强.
原始图和参考图中的灰度累积概率使用就近原则建立关系.

数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

均衡化的实现:

  • 如果原图像的灰度值a的累积概率为 C P a CP_{a} CPa, 则该累积概率值所对应的等概率分布图像的灰度值为 ( b m a x − b m i n ) × C P a + b m i n (b_{max}-b_{min})×CP_{a} + b_{min} (bmaxbmin)×CPa+bmin, 其中 b m a x , b m i n b_{max}, b_{min} bmax,bmin分别为预期要得到的灰度最大值和最小值.

  • 数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

opencv具体代码实现:

Mat img = imread(path, IMREAD_GRAYSCALE);
Mat result;
equalizeHist(img, result);

Mat com_img;
hconcat(img, result, com_img);    //拼接图像
imshow("equalizeHist Image", com_img);
waitKey(0);

数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

局部直方图均衡:

Mat localEqualizeHist(Mat input, int blockSize) {
    Mat result = input.clone();
    for (int y = 0; y + blockSize < result.rows; y += blockSize) {
        for (int x = 0; x + blockSize < result.cols; x += blockSize) {
            Mat localImg(result, Rect(x, y, blockSize, blockSize)); //见博客结尾补充第二点
            equalizeHist(localImg, localImg);
        }
    }
    return result;
}

void test(string path) {
    Mat img = imread(path, IMREAD_GRAYSCALE);
    Mat histResult;
    equalizeHist(img, histResult);

    Mat localHistRes = localEqualizeHist(img, 3);

    Mat comImg;
    hconcat(img, histResult, comImg);    //拼接图像
    hconcat(comImg, localHistRes, comImg);

    imshow("equalizeHist Image", comImg);
    waitKey(0);
}

数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

3.2 直方图匹配

示例: 图A为原始图像, 图B为参考图像
此图演示的是概率值往大的方向就近, 所以图A的"1"与图B的"2"建立联系
直方图匹配大多数时候都是试凑过程.
数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

4. 空间滤波基础

4.1 空间滤波原理

滤波产生一个新像素, 新像素的坐标等于邻域中心的坐标, 像素的值是滤波操作的结果.若执行的是线性操作, 则该滤波器称为线性空间滤波器, 反之, 则相反. 滤波器作用的结果主要与滤波器系数和大小有关.
数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

4.2 空间相关与卷积

相关: 滤波器模板移过图像并计算每个位置乘积之和的处理.

  • w ( x , y ) ☆ f ( x , y ) = ∑ s = − a a ∑ t = − b b w ( s , t ) f ( x + s , y + t ) w(x,y)☆f(x,y)=\sum_{s=-a}^{a}\sum_{t=-b}^{b}w(s,t)f(x+s,y+t) w(x,y)f(x,y)=s=aat=bbw(s,t)f(x+s,y+t)

卷积: 机制类似, 但首先要把滤波器旋转180度.

  • w ( x , y ) ★ f ( x , y ) = ∑ s = − a a ∑ t = − b b w ( s , t ) f ( x − s , y − t ) w(x,y)★f(x,y)=\sum_{s=-a}^{a}\sum_{t=-b}^{b}w(s,t)f(x-s,y-t) w(x,y)f(x,y)=s=aat=bbw(s,t)f(xs,yt)

注意: 在图像处理文献中,您很可能会遇到卷积滤波器、卷积模板或卷积核这些术语, 但是这些滤波器未必用到真正的卷积, 要避免混淆.

5. 平滑空间滤波器

通常用于模糊处理和降低噪声.

5.1 平滑线性滤波

opencv实现直接调用blur函数即可.

Mat smoothFilter(Mat input, int blockSize) {
	Mat result;
    // 下图使用的滑动块大小为9
	blur(input, result, Size(blockSize, blockSize));
	
	Mat thresholdedImg;
    //表示灰度值大于105的像素设置为255(最大值).
	threshold(result, thresholdedImg, 105, 255, THRESH_BINARY);

	imshow("original", input);
	imshow("smoothed", result);
	imshow("thresholded", thresholdedImg);

	waitKey(0);
	return result;
}

数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv),学习,笔记,c++,图像处理,opencv

5.2 统计排序(非线性)滤波器

本节主要介绍中值滤波器, 该类滤波器对于处理脉冲噪声(椒盐噪声)非常有效. 具体流程为, 首先将邻域内的像素分类排序, 确定其中值, 将该中值赋予滤波后的对应像素点. 例如, 对于3x3的邻域, 中值为第5大的值.
opencv使用medianBlur函数即可, 但注意, 其滤波核的大小必须为奇数.文章来源地址https://www.toymoban.com/news/detail-769456.html

opencv的补充:

  1. 使用cv::Mat::isContinously()来判断图像矩阵是否以连续方式存储
  2. 为了避免很大的图像进行不必要的复制, 每个Mat对象都有自己的表头, 复制运算符只复制标头和指向大矩阵的指针, 而不是数据本身.
    例: 在一个大图像上创建感兴趣的区域.
Mat D (A, Rect(10, 10, 100, 100) ); //使用矩阵完成
Mat E = A(Range::all(), Range(1,3)); //使用行, 列完成边界
// 此时修改D或E, 同样会修改矩阵A中对应区域的值.

到了这里,关于数字图像处理第三章 学习笔记附部分例子代码(C++ & opencv)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (数字图像处理MATLAB+Python)第八章图像复原-第三、四节:图像复原代数方法和典型图像复原方法

    图像复原代数方法 :根据退化模型,假设具备关于 g g g 、 H H H 、 n n n 的某些先验知识,确定某种最佳准则,寻找原图像 f f f 的最优估计 无约束最小乘方复原 :是一种用于恢复受损图像的方法。它基于最小化平方误差的原则,以尽可能接近原始图像为目标。假设我们有一个

    2024年02月05日
    浏览(73)
  • (数字图像处理MATLAB+Python)第七章图像锐化-第三节:高斯滤波与边缘检测

    高斯函数 :是一种常见的连续函数,通常用符号 G ( x ) G(x) G ( x ) 表示。它可以用下面的公式定义 G ( x ) = 1 σ 2 π e − x 2 2 σ 2 G(x)=frac{1}{sigma sqrt{ 2pi }}e^{-frac{x^{2}}{2sigma^{2}}} G ( x ) = σ 2 π ​ 1 ​ e − 2 σ 2 x 2 ​ 其中, x x x 是自变量, σ sigma σ 是一个正实数,表示高斯函

    2024年02月06日
    浏览(29)
  • (数字图像处理MATLAB+Python)第十二章图像编码-第三、四节:有损编码和JPEG

    A:概述 预测编码 :是一种数据压缩技术,旨在通过利用数据中的 统计规律来减少存储或传输所需的比特数 。它基于预测模型,根据已经观察到的数据来预测未来的数据,并将预测误差编码和传输。预测编码的过程通常包括以下几个步骤 模型训练 :首先,根据已有的数据,

    2024年02月09日
    浏览(31)
  • 第三章 处理机调度

    目录 一、调度的概念、层次 2.1 调度的基本概念 2.2 调度的三个层次 2.2.1 高级调度 2.2.2 低级调度 2.2.3 中级调度 2.2.3.1 进程的挂起态 2.2.4 三层调度的联系、对比 二、进程调度的时机、切换与过程、方式 2.1 进程调度的时机 2.2 进程调度的方式 2.2.1 非抢占方式 2.2.2 抢占方式

    2024年02月10日
    浏览(27)
  • 第三章 图像的低通与高通滤波

    前面讲解了一些图像的基本理论以及操作,这一张将聚焦与图像的滤波操作。 解释: 图像卷积是一种在图像处理中广泛使用的操作。其基本思想是在图像的每个像素点上,以该点为中心选择一个固定大小的滤波器模板(通常是一个矩阵),并将该滤波器与该像素点及其相邻

    2024年02月05日
    浏览(26)
  • 数字图像处理 - 形态学算法 - 颗粒划分 - 冈萨雷斯第三版 - 9.36

    形态学算法 - 颗粒分割 项目地址:https://github.com/LetMeFly666/MorphologicalAlgorithm_ParticleSegmentation 在线文档: https://maps.letmefly.xyz 显微应用中一个预处理步骤是从两组或更多组重叠的类似颗粒(见右图)中分离出单个独立的一种颗粒。假设所有颗粒的大小相同,提出一种产生3幅图

    2024年02月04日
    浏览(41)
  • 大数据分析-第三章 大数据存储和处理

    关系型数据库 NoSQL:泛指非关系型数据库,比如MongoDB 全文检索框架:Elasticsearch 行式存储:大数据量查询,如果没有索引,则会遍历 列式存储:可以大量的压缩空间 位图索引 位图索引的例子,如下图所示,我们可以存储为 “男”:100101 “女”:011010 行号 姓名 1 男 2 女 3 女 4 男

    2024年02月09日
    浏览(31)
  • 第三章:DeepLabV3——重新思考用于语义图像分割的扩张卷积

    原问题目:《Rethinking Atrous Convolution for Semantic Image Segmentation》 原文引用:Chen L C, Papandreou G, Schroff F, et al. Rethinking atrous convolution for semantic image segmentation[J]. arXiv preprint arXiv:1706.05587, 2017. 发表时间:2018年1月 原文链接: https://arxiv.org/pdf/1706.05587.pdf%EF%BC%8C%E6%8E%A8%E8%8D%90%E5%9C%A8

    2024年02月16日
    浏览(44)
  • 数字图像处理 - 图像处理结合机器学习的应用示例

            在本文中,特别关注树叶分类机器学习技术的实现。我们的目标是演示如何利用机器学习算法来分析一系列叶子照片,从而实现准确分类并提供对植物领域有价值的算法。         图像处理中机器学习的本质         机器学习使计算机能够学习模式并根据

    2024年02月13日
    浏览(31)
  • 第三十三章:RPA与自然语言处理的安全保障

    RPA(Robotic Process Automation)和自然语言处理(NLP)是两种不同的技术领域,但它们在现实生活中的应用中有很多相互关联和相互影响的地方。在这篇文章中,我们将讨论RPA与自然语言处理的安全保障,以及如何在实际应用中保障数据安全和系统安全。 自然语言处理(NLP)是一种通过计

    2024年02月22日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包