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

彩色图像处理

    • [0. 前言](#0. 前言)
    • [1. 彩色基础](#1. 彩色基础)
    • [2. 彩色模型](#2. 彩色模型)
    • [3. 伪彩色图像处理](#3. 伪彩色图像处理)
      • [3.1 灰度分层](#3.1 灰度分层)
      • [3.2 灰度到彩色的变换](#3.2 灰度到彩色的变换)
    • [4. 彩色变换](#4. 彩色变换)
      • [4.1 色调和彩色校正](#4.1 色调和彩色校正)
    • [5. 基于彩色的图像分割](#5. 基于彩色的图像分割)
      • [5.1 HSI彩色空间的分割](#5.1 HSI彩色空间的分割)
      • [5.2 彩色边缘检测](#5.2 彩色边缘检测)

0. 前言

本章的重点内容就是理解彩色模型, 就是在灰度图像的基础上添加了图像的通道数, 具体的变换与前面的知识类似.

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

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

前情回顾:
数字图像处理第三章 灰度变换和空间滤波 学习笔记
数字图像处理第四章 频率域滤波 学习笔记

数字图像处理第五章 图像复原和重建(内容较简单,就没有详细记录笔记)

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

1. 彩色基础

基本概念:

  1. 亮度: 表示无色的强度概念.
  2. 色调: 表示观察者感知的主要颜色.
  3. 饱和度: 相对的纯净度, 或一种颜色混合白光的数量.
  4. 色度: 色调+饱和度, 对于彩色融合非常有用.

2. 彩色模型

本节介绍了几种模型: RGB模型, HSI模型, 并阐述了模型之间的转换方式

从RGB到HSI的转换:

H分量由下式得到:

H = { θ , B ≤ G 360 − θ , B > G H=\left\{\begin{matrix} \theta,\quad\quad\quad B\leq G \\ 360-\theta,\quad B > G \end{matrix}\right. H={θ,B≤G360−θ,B>G

其中,

θ = arccos ⁡ { 1 2 ( R − G ) + ( R − B ) \[ ( R − G ) 2 + ( R − B ) ( G − B ) 1 / 2 } \theta=\operatorname{arccos}\left\{{\frac{\displaystyle{\frac{1}{2}}(R-G)+(R-B)}{\\displaystyle{\\left\[(R-G)\^{2}+(R-B)(G-B)\\right^{1/2}}}}\right\} θ=arccos⎩ ⎨ ⎧(R−G)2+(R−B)(G−B)1/221[(R−G)+(R−B)⎭ ⎬ ⎫

饱和度分量由下式得到:

S = 1 − 3 ( R + G + B ) m i n ( R , G , B ) S=1-\frac{3}{(R+G+B)}\\mathrm{min}(R,G,B) S=1−(R+G+B)3min(R,G,B)

强度分度由下式:

I = 1 3 ( R + G + B ) I=\frac{1}{3}(R+G+B) I=31(R+G+B)

从HSI到RGB的转换就复杂一些, 需要考虑扇区范围. 这里就不贴出来了

3. 伪彩色图像处理

基于一种指定的规则对灰度值赋以颜色的处理

3.1 灰度分层

指定一个灰度值作为分层, 大于该灰度值的部分赋以一种颜色, 小于该灰度值的部分赋以另一种颜色.

3.2 灰度到彩色的变换

4. 彩色变换

变换模型如同灰度变换:

g ( x , y ) = T f ( x , y ) g(x,y)=T{\big}f(x,y){\\big} g(x,y)=Tf(x,y)

4.1 色调和彩色校正

给出校正函数再实现即可.

5. 基于彩色的图像分割

5.1 HSI彩色空间的分割

opencv分割起来很简单, 使用split函数:

c 复制代码
void test01(string path) {
    Mat img = imread(path);
    if (img.empty()) {
        cout << "Error: unable to load the image\n";
        return;
    }
    //cout << img.channels() << endl;

    resize(img, img, Size(256, 256));


    Mat hsvImg;
    cvtColor(img, hsvImg, COLOR_BGR2HSV);
    vector<Mat> hsvCh;
    split(hsvImg, hsvCh);
    imshow("h channel", hsvCh[0]);
    imshow("s channel", hsvCh[1]);
    imshow("v channel", hsvCh[2]);

    waitKey(0);
}

5.2 彩色边缘检测

opencv有很多实现方式, 这里使用Sobel算子来进行检测:

c 复制代码
void test03(string path) {
    Mat img = imread(path);
    if (img.empty()) {
        cout << "Error: unable to load the image\n";
        return;
    }
    Mat gray_img;
	// 如果不转成灰度图片, 就需要对三通道单独计算
    cvtColor(img, gray_img, COLOR_BGR2GRAY);
    //计算梯度
    Mat gradientX, gradientY;
    Sobel(gray_img, gradientX, CV_32F, 1, 0, 1);
    Sobel(gray_img, gradientY, CV_32F, 0, 1, 1);

    Mat gradientMag;
    magnitude(gradientX, gradientY, gradientMag);

    double threshold = 50.0;
    cv::Mat edges;
    cv::threshold(gradientMag, edges, threshold, 255, cv::THRESH_BINARY);

    imshow("original", img);
    imshow("gradientXY", edges);
    waitKey(0);
}
相关推荐
mykj15512 小时前
英语单词APP解锁学习新方式,智能高效背单词
学习·英语单词app
知识分享小能手2 小时前
深度学习学习教程,从入门到精通,深度学习中的正则化 — 完整知识点与代码示例(7)
人工智能·深度学习·学习
~kiss~3 小时前
Agent 的 未来吗?String: An Agentic OS Where Every App Is a Markdown File
学习
Tairitsu_H3 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
HugoStudio_SWAN4 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
猎头南楼5 小时前
VLA 模型落地端侧:从架构选型到量化部署的工程实践笔记
笔记·架构·大模型
会周易的程序员6 小时前
5Draft(五帝)测试报告
服务器·c++·分布式·raft·共识算法·共识·算力服务器
Capricorn19886 小时前
日志级幻觉排障:GPT-6 Astra 迈入 AGI 时代,知芽 Notebook Skill 如何以引用校验与零命中诚实弃权解决长文失忆
论文阅读·人工智能·笔记·gpt·agi
UIU1146 小时前
scanf与cout的误区:探究其内部的机制
c++·学习·c#·scanf
闻缺陷则喜何志丹6 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统