数字图像处理——第六章 彩色图像处理
数字图像处理——第六章 彩色图像处理
文章目录
- 数字图像处理——第六章 彩色图像处理
- 1 彩色模型
- 1.1 RGB彩色模型
- 1.2 CMY 和CMYK彩色模型
- 1.3 HSI彩色模型
- 2 伪彩色图像处理
- 2.1 灰度分层
- 2.2 灰度到彩色的变换
- 3 彩色图像的分割
- 3.1 RGB中的彩色图像分割
- 3.2 彩色边缘检测
1 彩色模型
1.1 RGB彩色模型
RGB模型是工业界的一种颜色标准. 是通过对红(Red)、绿(Green)、蓝(Blue)3种颜色亮度的变化以及它们相互之间的叠加来得到各种各样的颜色。RGB彩色空间对应的坐标系统是如图所示的立方体
其实在绪论中就有说过彩色图像的相关知识,复习亿下。
像素:数字图像由二维的元素组成,每一个元素具有一个特定的位置(x,y)和幅值f(x,y),这些元素就称为像素,它是数字图像的基本单位。
彩色图像:用红、绿、蓝三元组的二维矩阵来表示。三元组的每个数值也是在0-255之间,0表示相应的基色在该像素中没有,而255表示相应的基色在该像素中取得最大值,所以越接近0越黑,越接近255越白。
利用python提取出RGB三通道图像:
代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
img = cv2.imread(' ')
plt.figure(dpi = 180)plt.subplot(141)
plt.imshow(img)
plt.title("原图")
plt.subplot(142)
plt.imshow(img[:, :, 0])
plt.title("B")plt.subplot(143)
plt.imshow(img[:, :, 1])
plt.title("G")plt.subplot(144)
plt.imshow(img[:, :, 2])
plt.title("R")
plt.tight_layout()
plt.show()
实验结论:首先有个小问题,可以看出原图和真正的原图长得不一样, 这是因为我读取的方式采用的是opencv,而show采用的是matplotlib,这两者接口的模式不一致。opencv 的接口使用BGR模式,而 matplotlib.pyplot 接口使用的是RGB模式。所以上述原图长得不像原图。解决方法,从opencv读取后转成RGB格式 img = img[:, :, [2, 1, 0]]即可,如下所示
只需要在上述代码中读取img之后,加入 img = img[:, :, [2, 1, 0]]即可。
1.2 CMY 和CMYK彩色模型
CMY是青(Cyan)、洋红或品红(Magenta)和黄(Yellow)三种颜色的简写,是相减混色模式,用这种方法产生的颜色之所以称为相减色,乃是因为它减少了为视觉系统识别颜色所需要的反射光。和RGB的区别在于:RGB是红(Red)、绿(Green)和蓝(Blue)三种颜色的简写,是相加混色模式,每种颜色分量越多,得到的颜色越亮,每种颜色的取值范围为0~255;RGB常用于计算机显示方面。
由于彩色墨水和颜料的化学特性,用三种基本色得到的黑色不是纯黑色,因此在印刷术中,常常加一种真正的黑色(black ink),这种模型称为CMYK模型,广泛应用于印刷术。每种颜色分量的取值范围为0~100;CMY常用于纸张彩色打印方面。
CMY和RGB其实是互补的颜色类型。
[CMY]=[111]−[RGB]\left[\begin{array}{c} C \\ M \\ Y \end{array}\right]=\left[\begin{array}{l} 1 \\ 1 \\ 1 \end{array}\right]-\left[\begin{array}{l} R \\ G \\ B \end{array}\right] ⎣⎡CMY⎦⎤=⎣⎡111⎦⎤−⎣⎡RGB⎦⎤
以上假设所有的颜色全部归一化到了[0,1]之间,C M Y 主要表示颜料的表面所反射的颜色,上式表明涂有青色颜料的表面所反射的光中不包含红色,类似的,纯深红色不反射绿色,纯黄色不反射蓝色。所以CMY其实就是RGB的补色。
因为CMY所组合的颜色不是纯黑,所以为了产生真正的黑色,我们一般在模型里面加入CMYK的k即代表黑色。
1.3 HSI彩色模型
色调H(Hue):与光波的波长有关,它表示人的感官对不同颜色的感受,如红色、绿色、蓝色等,它也可表示一定范围的颜色,如暖色、冷色等。
饱和度S(Saturation):表示颜色的纯度,纯光谱色是完全饱和的,加入白光会稀释饱和度。饱和度越大,颜色看起来就会越鲜艳,反之亦然。
亮度I(Intensity):对应成像亮度和图像灰度,是颜色的明亮程度。
HSI是指一个数字图像的模型,它反映了人的视觉系统感知彩色的方式,以色调、饱和度和亮度三种基本特征量来感知颜色。HSI模型的建立基于两个重要的事实:
第一个,分量与图像的彩色信息无关;
第二个,H和S分量与人感受颜色的方式是紧密相联的。这些特点使得HSI模型非常适合彩色特性检测与分析。
从RGB空间到HSI空间的转换,即分别求出HSI参数
代码如下:
def RGB2HSI(rgb_img):"""传入RGB乳香,返回HSI图像"""#保存原始图像的行列数row = np.shape(rgb_img)[0]col = np.shape(rgb_img)[1]#对原始图像进行复制hsi_img = rgb_img.copy()#对图像进行通道拆分B,G,R = cv2.split(rgb_img)#把通道归一化到[0,1][B,G,R] = [ i/ 255.0 for i in ([B,G,R])]H = np.zeros((row, col)) #定义H通道I = (R + G + B) / 3.0 #计算I通道S = np.zeros((row,col)) #定义S通道for i in range(row):den = np.sqrt((R[i]-G[i])**2+(R[i]-B[i])*(G[i]-B[i]))thetha = np.arccos(0.5*(R[i]-B[i]+R[i]-G[i])/den) #计算夹角h = np.zeros(col) #定义临时数组#den>0且G>=B的元素h赋值为thethah[B[i]<=G[i]] = thetha[B[i]<=G[i]]#den>0且G<=B的元素h赋值为thethah[G[i]<B[i]] = 2*np.pi-thetha[G[i]<B[i]]#den<0的元素h赋值为0h[den == 0] = 0H[i] = h/(2*np.pi) #弧度化后赋值给H通道#计算S通道for i in range(row):min = []#找出每组RGB值的最小值for j in range(col):arr = [B[i][j],G[i][j],R[i][j]]min.append(np.min(arr))min = np.array(min)#计算S通道S[i] = 1 - min*3/(R[i]+B[i]+G[i])#I为0的值直接赋值0S[i][R[i]+B[i]+G[i] == 0] = 0#扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间hsi_img[:,:,0] = H*255hsi_img[:,:,1] = S*255hsi_img[:,:,2] = I*255return hsi_img
2 伪彩色图像处理
2.1 灰度分层
伪彩色图像处理也叫假彩色图像处理,根据一定的准则对灰度值赋以彩色的处理。
灰度级分层通常用于突出感兴趣的特定灰度范围内的亮度。灰度级分层有两大基本方法。
- 将感兴趣的灰度范围内的值显示为一个值(比如0),而其他范围的值为另外一个值(255)。
- 将感兴趣的灰度范围内的值显示为一个值(比如0),而其他范围的值不变。
代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def grayscale_layer(input_image, spotlight_range_min, spotlight_range_max, means):'''灰度级分层:param input_image: 原图像:param spotlight_range_min: 所突出的灰度级范围最小值:param spotlight_range_max: 所突出的灰度级范围最大值:param means: 分层方式(1,2):return: 灰度级分层后的图像'''input_image_cp = np.copy(input_image) # 输入图像的副本if means == 1: # 方式一(突出指定范围内255,并且变暗非范围内0)input_image_cp = np.where((input_image_cp >= spotlight_range_min) & (input_image_cp <= spotlight_range_max), 255, 0)elif means == 2: # 方式二(仅突出指定范围内255)input_image_cp[np.where((input_image_cp >= spotlight_range_min) & (input_image_cp <= spotlight_range_max))] = 255else:print("please enter the number of means from 1 to 2")returnoutput_image = input_image_cpreturn output_image.astypetype(np.uint8)img = cv2.imread(' ')
img = img[:, :, [2, 1, 0]]
plt.figure(dpi = 180)plt.subplot(131)
plt.imshow(img)
plt.title("原图")plt.subplot(132)
plt.imshow(output_1)
plt.title("output_1")plt.subplot(133)
plt.imshow(output_2)
plt.title("output_2")plt.tight_layout()
plt.show()
2.2 灰度到彩色的变换
首先我们需要一张灰度图,读取灰度图的方式有好几种,这里用opencv读取灰度图,然后用matplotlib显示。读取方式为:
img = cv2.imread(' ', 0) # 0代表着以灰度图的方式读取
但是直接使用plt显示图像,它默认使用三通道显示图像。所以你管这绿的叫灰度图?所以在plt.imshow()添加参数,plt.imshow(img, cmap=“gray”),这样就能得到正经的灰度图。
opencv中自带函数cv2.applyColorMap(img, cv2.COLORMAP_JET)能将灰度图像转化成伪彩色图像,效果如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = Falseimg = cv2.imread('C:/Users/yujunliu/Pictures/Saved Pictures/dongman.jpg', 0)
img = img[:, :, [2, 1, 0]]
im_color = cv2.applyColorMap(img, cv2.COLORMAP_JET)plt.figure(dpi = 100)plt.subplot(121)
plt.imshow(img, cmap = "gray")
plt.title("灰度图")plt.subplot(122)
plt.imshow(im_color)
plt.title("伪彩色图像")plt.tight_layout()
plt.show()
3 彩色图像的分割
彩色空间分割是基于单色图像(灰度图)分割技术在不同颜色通道上实现的。灰度图分割技术常见的有:直方图阀值化、特征聚类、边缘检测、基于区域的、模糊技术、神经网络等。灰度图的分割方法都是基于区域像素的非连续性或相似性。基于非连续性的方法主要是为了检测孤立的点、边缘、线(灰度突然变化的地方)。基于相似性的方法包括阀值、聚类、区域分割合并等。
3.1 RGB中的彩色图像分割
本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间,颜色去除白色背景部分具体就调用了cv2的两个函数,一个是rgb转hsv的函数,另一个是利用cv2.inRange函数设阈值,去除背景部分。
代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def color_seperate(image):hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) #对目标图像进行色彩空间转换#设定蓝色下限lower_hsv = np.array([20, 20, 20]) #设定蓝色上限upper_hsv = np.array([255, 255, 255]) mask = cv2.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv) dst = cv2.bitwise_and(image, image, mask=mask) return dstimg = cv2.imread(' ')
out = color_seperate(img)
plt.figure(dpi = 100)plt.subplot(121)
plt.imshow(img)
plt.title("原图")plt.subplot(122)
plt.imshow(out)
plt.title("output")plt.tight_layout()
plt.show()
核心函数在于cv2.inRange,参数有三个
第一个参数:原图
第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0
第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0
而在lower_red~upper_red之间的值变成255
3.2 彩色边缘检测
在图像识别中,需要有边缘鲜明的图像,即图像锐化。图像锐化的目的是为了突出图像的边缘信息,加强图像的轮廓特征,以便于人眼的观察和机器识别。图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。本次利用Canny算子来实现边缘检测。图像边缘检测必须满足两个条件,一能有效地抑制噪声;二必须尽量精确确定边缘的位置。根据对信噪比与定位乘积进行测度,得到最优化逼近算子,这就是Canny边缘检测算子。
Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
最好的检测: 算法能够尽可能多地标识出图像中的实际边缘。
最好的定位: 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。
最小的响应:图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。
这里采用opencv C++版本调用摄像头实现Candy算子:
代码如下:
#include <opencv2\opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;int main()
{VideoCapture capture(0);while (1){Mat frame; Mat dstImage, edge, grayImage; //参数定义capture >> frame; //将原图像转换为灰度图像cvtColor(frame, grayImage, CV_BGR2GRAY);//先用使用 3x3内核来降噪blur(grayImage, edge, Size(3, 3));//运行Canny算子Canny(edge, edge, 3, 9, 3);imshow("读取视频", edge); waitKey(30);}return 0;
}
数字图像处理——第六章 彩色图像处理相关推荐
- 数字图像处理 第六章 彩色图像处理
第六章 彩色图像处理 一.彩色基础 物理性质 消色与彩色光 人眼传感器 原色和合成色 颜色特征 二.彩色模型 2.1RGB彩色模型 2.1.1RGB示意图 2.2CMY和CMYK彩色模型 2.3HSI ...
- 数字图像处理第六章——彩色图像处理(上)
数字图像处理第六章 数字图像处理---彩色图像处理 (一) 在 MATLAB 中彩色图像的表示 1.1 RGB图像 1.2 索引图像 1.3 处理 RGB图像和索引 (二)彩色空间之间的转换 2.1 ...
- 数字图像处理第六章 ——彩色图像处理(下)
数字图像处理第六章 数字图像处理---彩色图像处理 (五) 彩色图像的空间滤波 5.1 彩色图像的平滑处理 5.2 彩色图像的锐化处理 (六) 直接在 RGB 矢量空间中处理 6.1 使用梯度的彩色边 ...
- 数字图像处理第六章 彩色图像处理
彩色图像处理 1 彩色模型 1.1 RGB彩色模型 1.2 HSI彩色模型 2 彩色空间之间的转换 2.1 NTSC彩色空间 2.2 YCbCr彩色空间 2.3 CMY和CMYK彩色空间 2.4 HS ...
- 数字图像处理--第六章彩色图像处理基础
文章目录 6 彩色图像处理 6.1 彩色基础 6.2 彩色模型 6.2.1 RGB彩色模型 6.3 伪彩色图像处理 6.3.1 强度分层 6.4 全彩色图像处理 6.5 查色标(查找表)Look Up ...
- 数字图像处理第六章——彩色图像处理
目录 引言 一.彩色基础 二.彩色模型 2.1 RGB彩色模型 2.2 CMY和CMYK彩色模型 2.3 HSI彩色模型 三.伪彩色图像处理 3.1 灰度分层 3.2 灰度到彩色的变换 四.彩色变换 ...
- 数字图像处理——第六章彩色图像处理
文章目录 6.1 彩色模型简介 6.1.1 RGB彩色模型 6.1.2 CMY/CMYK模型 6.1.3 HSI模型 6.2 伪图像处理 6.3 彩色变换 总结 6.1 彩色模型简介 彩色模型也称为彩 ...
- 第六章 彩色图像处理
文章目录 6.2 彩色模型 6.2.1 RGB模型 6.2.2 CMY模型 6.2.3 HSI彩色模型 从RGB到HSI的彩色转换 6.3 伪彩色模型 6.3.1 灰度分层 6.3.2 灰度到彩色的变 ...
- 数字图像处理——第六章(彩色图像处理)
彩色图像处理 一.彩色基础 1.1 彩色 1.2 三原色 1.3 颜色表示 二.彩色模型 2.1 RGB模型(相加混色模型,主要用于显示) 2.2 CMY和CMYK彩色模型(相减混色模型) 2.3 H ...
最新文章
- xcode4发布测试-打包(Archive)
- c语言ue,小话C语言中的cotinue和break
- php chr 乱码,php chr() ord()中文截取乱码问题解决方法_PHP教程
- java对字符串归一化_搜索引擎中的字符串归一化 | 学步园
- 在两个Silverlight应用间数据通信(包括与Flash通信)
- 喝什么汤对肝脏有好处?
- AcWing323. 战略游戏(树形DP)题解
- codevs——1044 拦截导弹(序列DP)
- 学写压缩壳心得系列之一 熟悉概念,未雨绸缪
- Linux系统p4vasp使用教程,[分享]一个详细的p4vasp安装指南 - 计算模拟 - 小木虫 - 学术 科研 互动社区...
- UDP协议和TCP协议
- PHP抓取淘宝店铺等级、评分
- java spy_Java Spy-代码跟踪神器
- 10、持续集成流水线实践:流水线建设从Jenkins部署开始
- MYSQL 数据库给表加约束条件 (史上最详细教程!)!!
- 新版Space数字藏品源码+NFT数字藏品系统
- 太原理工大学计算机专业老师,郝晓燕 - 太原理工大学 - 信息与计算机学院
- html 解析接口返回数据,请求第三方接口返回json格式数据的解析
- git生成SSH秘钥
- 知识付费对接微信公众号订阅消息
热门文章
- Kotlin 创建对象
- mongodb之备份
- maven nexus 3 third party 构件上传
- jquery checkbox勾选/取消勾选的诡异问题
- php中$_REQUEST、$_POST、$_GET的区别和联系小结
- 实现一个基于 SharePoint 2013 的 Timecard 应用(下)
- 使用 Sticky-Kit 实现基于 jQuery 的元素固定效果
- mysql存储过程导出_Mysql导出存储过程
- java 构建是什么意思_构建的概念
- linux执行命令段错误,Linux运行fortran程序 出现段错误(segmentation fault)