ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

彩色与多光谱图像处理实战:颜色空间、增强分割与波段降维

彩色与多光谱图像处理实战:颜色空间、增强分割与波段降维 简介彩色与多光谱图像处理PPT教案是一份面向图像处理、计算机视觉及相关专业学习者的教学演示文稿适合课程讲授、课前预习与考研复习使用。内容从彩色视觉与三基色原理、相加混色和相减混色入手系统讲解RGB、HSI等常用彩色模型并延伸到彩色变换、图像增强、平滑、锐化、边缘检测与分割等典型处理环节同时覆盖多光谱图像处理及高光谱遥感应用部分理论讲解与图示结合便于建立完整知识框架。资源包共1个文件为1份pptx教案文件大小2.13MB共114页结构清晰、可直接演示。目前已有127人学习浏览适合需要系统梳理彩色图像处理知识体系的图像处理课程学习者使用。1. 从三基色到CIE色度图彩色图像处理前必须建立的色度学直觉直接对彩色图像的三个RGB通道分别做阈值分割常常得到比预期多一倍的噪声区域。调了半天参数问题往往不在阈值本身而在把红绿蓝当成相互独立的数值坐标忽略了人对颜色的感知是亮度、色调、饱和度共同作用的结果。这份《彩色与多光谱图像处理》PPT教案把三基色原理、相加混色与相减混色、CIE色度图放在最前面其实是在给后续的彩色图像增强、平滑、锐化、边缘检测与分割划定一个统一的坐标系。适合刚接手视觉项目的开发者和要整理图像处理课件的工程师也适合正在准备遥感图像处理多光谱实验的人。理解了色度学这层基础再去选模型和算子才不会在参数调优里一直绕圈子。2. RGB、CMY与HSI彩色模型的数学表达与转换实现2.1 相加混色与相减混色同一束白光的两条路径屏幕和投影仪是自发光设备像素颜色由红绿蓝三束光按比例相加产生。红色加蓝色得品红红色加绿色得黄色绿色加蓝色得青色三基色等比例相加接近白色。这里的关键不是记住公式而是理解加法混色的结果亮度越混越高在CIE色度图上的坐标会向等能量点移动。课件里给出的“红色青色白色”等关系本质上是在说三基色与三补色之间有一一对应的吸收关系这在做白平衡和颜色校正时非常有用。印刷和染料走的是另一条路径。相减混色利用颜料吸收特定波长的光白色减去红色得到青色白色减去绿色得到品红白色减去蓝色得到黄色减得越多颜色越暗。打印设备要在CMY基础上加黑色墨量K因为CMY三色混合产生的黑色不够纯而且等量CMY墨量成本太高。工程上判断用哪种模型先看设备是发射光还是反射光。混色方式基色合成示例典型设备相加混色红、绿、蓝RGYRBMGBCRGBW显示器、视频摄像机相减混色青、品红、黄W-RCW-GMW-BYW-R-G-BK打印机、印染2.2 RGB彩色立方体与CMY/CMYK的转换关系RGB模型是一个正交立方体三个轴分别表示红、绿、蓝分量原点对应黑色对角顶点对应白色。CMY模型是RGB的补色表示可以直接用1减RGB得到但工程实现时有一个容易踩的坑图像读进来通常是0-255的uint8直接做255减反而得到负值或溢出。正确做法是先转成0-1浮点数再计算。import numpy as np def rgb_to_cmy(rgb): # rgb: 0-255 的 uint8 三通道图像 rgb_f rgb.astype(np.float32) / 255.0 cmy 1.0 - rgb_f # 黑色墨量 K 取 CMY 三个分量的最小值 k np.min(cmy, axis-1, keepdimsTrue) # 从 CMY 中减掉被黑色替代的部分得到 CMYK cmyk np.concatenate([cmy - k, k], axis-1) return cmy, cmyknp.min(cmy, axis-1)取出每个像素上最小的那个颜色分量作为黑色墨量因为青色、品红、黄色叠出来的那部分灰用黑墨替代成本更低。np.concatenate把剩余三分量与K拼成四通道输出。注意返回的cmyk是浮点型写入图像文件时需要先乘255并转回uint8。实际印刷中还要考虑总墨量上限和灰成分替代这里只对应课件里基础转换关系。2.3 RGB到HSI的转换公式与OpenCV实现课件里反复强调HSI模型的优势亮度I与色调H、饱和度S分离适合做基于人眼感知的彩色处理。OpenCV里虽然有HLS转换接口但HLS与HSI的亮度定义并不完全一致。严格复现HSI最方便的是自己写一个转换函数。import cv2 import numpy as np def rgb_to_hsi(img_bgr): # OpenCV 默认通道顺序是 BGR先分通道 img img_bgr.astype(np.float32) / 255.0 b, g, r cv2.split(img) eps 1e-6 I (r g b) / 3.0 min_rgb np.minimum(np.minimum(r, g), b) S 1.0 - 3.0 * min_rgb / (r g b eps) num ((r - g) (r - b)) / 2.0 den np.sqrt((r - g) ** 2 (r - b) * (g - b)) eps theta np.arccos(np.clip(num / den, -1.0, 1.0)) H np.where(b g, theta, 2 * np.pi - theta) # 映射到 OpenCV 常用的 0-180 范围便于显示和查看 H H * 180.0 / np.pi / 2.0 return H.astype(np.float32), S.astype(np.float32), I.astype(np.float32)核心是H的计算公式分母加eps是为了防止两个相邻像素颜色完全相同导致除零。np.clip限制num / den在-1到1之间避免arccos出现NaN。np.where(b g, theta, 2*np.pi-theta)处理色调角的象限问题否则绿色到蓝色区域的H会跳变。最后把弧度转成0-180的整数范围因为OpenCV里的H通道约定是0-180这和使用0-255标度的人容易搞混。2.4 用课件里的颜色例子验证转换结果课件中有个像素标注是 R200、G50、B120拿这个值代入上面的函数可以直观看到HSI三个分量的含义。分量归一化值HSI结果直观含义R0.784H ≈ 235 (0-255标度)色调偏向品红区域G0.196S ≈ 0.60中等纯度不是纯色B0.471I ≈ 0.48整体亮度中等这个像素在RGB里只是三组数值换成HSI后能直接说成“中等亮度的品红色饱和度一般”。实际调参时这种可解释性比在RGB立方体里找坐标有用得多。S分量低意味着图像偏灰做饱和度增强时就要放大S而不是动H。若S接近0H值没有物理意义后续处理必须用mask把这类像素排除。3. 彩色图像增强、平滑与锐化为什么先转HSI再处理亮度3.1 直方图均衡化RGB三通道分别处理会让色彩发灰不少人在OpenCV里做对比度增强时直接对R、G、B三个通道分别调用equalizeHist结果图像颜色严重偏移蓝天偏紫、绿草地发黄。原因是RGB通道之间相关性很强各自拉伸后三个通道的相对比例被破坏色彩平衡自然丢失。课件里把HSI模型放在增强之前正是为了提供“只改亮度、不动色度”的操作路径。import cv2 import numpy as np def equalize_rgb(img_bgr): # 方式一RGB三通道分别均衡容易产生色偏 b, g, r cv2.split(img_bgr) be cv2.equalizeHist(b) ge cv2.equalizeHist(g) re cv2.equalizeHist(r) return cv2.merge([be, ge, re]) def equalize_hsi(img_bgr): # 方式二转 HLS只均衡亮度通道 hls cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HLS) h, l, s cv2.split(hls) l_eq cv2.equalizeHist(l) hls_eq cv2.merge([h, l_eq, s]) return cv2.cvtColor(hls_eq, cv2.COLOR_HLS2BGR)equalizeHist只接受uint8单通道图HLS里的L分量正好是0-255可以直接用。注意OpenCV的HLS通道顺序是H、L、S不要和HSV搞混。方式二保留了H和S所以增强后色彩基本不变只是明暗关系更清晰。如果原图暗部噪声很大可以先对L做一次高斯模糊再均衡否则噪声会被放大成块状伪影。3.2 平滑高斯核与sigma怎么选通道分离会有什么副作用彩色图像平滑最常见的误区是模糊后出现彩色光晕。比如对RGB三通道分别做高斯模糊红色区域的边缘会渗到绿色背景里形成紫边。原因是不同通道的高斯加权结果在边缘附近比例不一致。更好的做法是在HSI或HLS空间只处理亮度分量让颜色本身保持完整。def smooth_hsi(img_bgr, ksize(5, 5), sigma0): hls cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HLS) h, l, s cv2.split(hls) l_blur cv2.GaussianBlur(l, ksize, sigma) hls_blur cv2.merge([h, l_blur, s]) return cv2.cvtColor(hls_blur, cv2.COLOR_HLS2BGR)高斯核的ksize必须是正奇数(3,3)适合轻度降噪(5,5)是通用选择(7,7)用于噪声明显的暗光图。sigma0时OpenCV会根据核大小自动计算标准差多数场景够用手动设到1.5或2.0会让边缘更柔和但过大的核会让边缘出现光晕。如果传感器噪声本身是彩色噪声比如Raw图像去马赛克后残留的彩色斑点则需要同时对S分量做较小的模糊否则亮度被平滑后彩色斑点反而更明显。核大小sigma适用场景主要副作用(3,3)0轻度噪声细节损失小(5,5)0一般监控画面边缘略糊(7,7)1.5夜间图像高光边缘易光晕3.3 锐化拉普拉斯叠加系数alpha如何把握锐化是用高通信息补偿模糊。点开Photoshop里的Unsharp Mask核心就是先在亮度通道做高斯模糊再用原图减去模糊图乘以强度系数加回去。这个思路同样可以放到HSI空间而且比在RGB三通道上分别做拉普拉斯更安全不会产生颜色振铃。def sharpen_hsi(img_bgr, alpha1.5): hls cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HLS) h, l, s cv2.split(hls) lap cv2.Laplacian(l, cv2.CV_32F, ksize3) l_sharp l.astype(np.float32) - alpha * lap l_sharp np.clip(l_sharp, 0, 255).astype(np.uint8) hls_sharp cv2.merge([h, l_sharp, s]) return cv2.cvtColor(hls_sharp, cv2.COLOR_HLS2BGR)Laplacian返回的是浮点类型直接和uint8相减会丢失负数导致边缘出现黑点或白点所以先把L转成float32再计算。alpha控制锐化强度0.5到1.0比较温和1.5算明显锐化超过2.0会在边缘两侧出现白边和黑边。图像本身噪声较大时拉普拉斯会把噪声梯度一并放大最好先做一次3x3高斯模糊再用模糊图参与锐化这也是UnsharpMask能比纯拉普拉斯更干净的原因。4. 彩色边缘检测与分割梯度算子、颜色距离与阈值参数的配合4.1 灰度Canny在彩色图像上的两种错误用法Canny是灰度算子但彩色图不能直接转灰度后做也不能粗暴地对每个通道分别Canny再合并。第一种做法的典型问题是红苹果和绿叶在灰度图上可能亮度接近苹果轮廓的灰度梯度非常弱边缘检测结果断裂严重。第二种做法看似合理实际更糟红通道的梯度方向、绿通道的梯度方向在同一个像素位置常常不一致三个通道的Canny结果按位或后会出现大量碎片边缘。# 错误示范三通道分别 Canny 再按位或 edges np.zeros_like(gray) for ch in range(3): e cv2.Canny(img_bgr[:, :, ch], 100, 200) edges cv2.bitwise_or(edges, e)Canny的双阈值100和200是经验值实际图像梯度分布不同固定阈值会漏检或误检。至于bitwise_or它把每个通道独立拾取的噪声点都保留下来最后得到的边缘图常常比原图还乱。课件里把彩色边缘检测单独列为一节就是为了避免这种“灰度方法平移”的思路。4.2 彩色梯度幅值合并保留真实色彩边缘正确做法是计算每个通道的梯度幅值再在颜色通道维度上合并。最常见的是取三个通道梯度幅值的最大值这样可以保留只在某一个通道上明显的颜色边界。比如红色和绿色虽然亮度接近但红通道和绿通道梯度方向相反组合起来仍然能形成很强的局部变化。def color_gradient(img_bgr, ksize3): grad_mag np.zeros(img_bgr.shape[:2], dtypenp.float32) for ch in range(3): gx cv2.Sobel(img_bgr[:, :, ch], cv2.CV_32F, 1, 0, ksizeksize) gy cv2.Sobel(img_bgr[:, :, ch], cv2.CV_32F, 0, 1, ksizeksize) mag cv2.magnitude(gx, gy) grad_mag np.maximum(grad_mag, mag) return grad_mag grad color_gradient(img_bgr) # 将浮点梯度归一化到 0-255 作为 uint8再阈值化 grad_norm cv2.normalize(grad, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8) _, edges cv2.threshold(grad_norm, 80, 255, cv2.THRESH_BINARY)cv2.magnitude计算梯度x和y的欧氏长度结果自然是非负数。np.maximum取三通道中的最大幅值边缘定位基本跟最强通道走。阈值80是在归一化之后使用的因为原始梯度幅值范围不稳定。若图像对比度低可以改用自适应阈值若是精细纹理识别可以用平均替代最大值避免单一通道的噪声被放大。方法边缘连续性噪声敏感度适用场景灰度Canny弱中灰度均匀的工业图三通道CannyOR中高彩色线条图通道梯度最大合并强中自然图像、遥感影像通道梯度平均合并强低多光谱波段选择后4.3 用HSV颜色距离做分割inRange参数怎么定边缘检测只能给出边界分割还需要把像素归到目标类别。在彩色空间做分割时HSV比RGB更直接因为色调H代表颜色类别S和V代表纯度与亮度。比如从蓝色背景中提取目标用inRange设定一个色相区间即可。hsv cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV) # 蓝色范围OpenCV 的 H 是 0-180 lower_blue np.array([100, 43, 46]) upper_blue np.array([124, 255, 255]) mask cv2.inRange(hsv, lower_blue, upper_blue) # 闭运算填充内部小洞 mask cv2.morphologyEx(mask, cv2.MORPH_CLOSE, np.ones((3, 3), np.uint8))inRange对三个通道分别比较区间所有通道满足条件才置255。H下界100和上界124对应课件里的蓝色S下界43是为了排除接近灰色的低饱和度像素V下界46是为了剔除接近黑色的暗部。如果图像里目标受光照影响V的上界不要设太高否则高光部分会被切碎。红色在HSV色相环上跨越0度两端需要拆成0-10和170-180两个区间分别取mask再按位或这是最容易漏掉的一个坑。目标色H范围S、V建议注意事项蓝色100-124S43V46深蓝要降低V下界绿色35-85S40V40草绿与黄绿易混红色0-10 或 170-180S50V50必须双区间合并5. 多光谱与高光谱图像处理的波段降维与验证方法5.1 多光谱和高光谱的差别为什么影响处理方法多光谱图像通常有十几个到几十个波段高光谱可能上百甚至几百个连续波段。波段一多相邻波段之间高度相关直接进入分类器会出现维度灾难。课件里把多光谱和高光谱放在最后一节实际工程中这一步就是降维与波段选择。5.2 PCA降维与波段筛选结合使用PCA是高光谱处理最常用的起点它把原始波段重新组合成互不相关的主成分前几个主成分往往能保留绝大部分方差。传统做法观察累计贡献率前三个主成分超过95%就可以直接作为伪彩色图显示。import numpy as np from sklearn.decomposition import PCA def reduce_bands(data_2d, n_components3): # data_2d: (像素数, 波段数) pca PCA(n_componentsn_components) reduced pca.fit_transform(data_2d) return reduced, pca.explained_variance_ratio_ def select_top_bands(data_3d, n5): # data_3d: (height, width, bands) std np.std(data_3d, axis(0, 1)) return np.argsort(std)[::-1][:n]PCA前要对每个波段做标准化否则灰度值大的波段会主导协方差矩阵贡献率看起来很高实际只反映了辐射亮度差异。标准差筛选则是直接挑方差最大的几个波段计算量小适合快速预览但它忽略了波段间的相关性。两者结合使用先用标准差筛掉明显无效的噪声波段再对剩余波段做PCA既省内存又保留主要信息。方法计算量保留信息适用场景标准差排序小单波段方差快速预览筛噪声PCA中全局协方差降维显示、特征压缩独立成分分析大独立分量混合像元分解验证降维是否合理可以把前三个主成分归一化后作为RGB显示观察地物边界是否清晰再用同一分类器分别在原始波段和降维特征上做精度对比。如果分类精度下降不超过5%说明降维没有丢掉有效信息。这个验证流程可以直接套用在遥感多光谱、医疗高光谱甚至工业光谱检测项目里和课件里的多光谱处理章节正好衔接上。本文还有配套的精品资源点击获取
返回列表