matlab与opencv基本操作
前言
本文讲解matlab与opencv对图像处理的基础操作,代码会有matlab与python两版,可对比学习。
读写
读入图像
matlab
1 | I = imread('cameraman.jpg'); |
python
1 | I = cv2.imread('cameraman.jpg', cv2.IMREAD_COLOR) |
cv2.IMREAD_COLOR = 强制读成 3 通道 BGR
彩色图。
存入图像
matlab
1 | imwrite(J,'cameramanC.jpg'); |
python
1 | cv2.imwrite('cameramanC.jpg', J) |
读图并转 double
matlab
1 | Image1 = im2double(imread('lotus.jpg')); |
imread把图像读成 0-255 的uint8。im2double把像素值线性缩放到 0–1 浮点,方便后续计算。
为什么要转成double
如果像素是 0–255,你在代码里写
0.299*r就永远只用到 0.299×255≈76 灰度级,结果会整体偏暗甚至直接截断。几级灰度的含义是什么
几级灰度”这句话里的“级”就是“台阶”的意思: 把黑→白这段连续亮度等间隔切成多少份,就有多少个离散台阶,叫多少灰度级。
- 2 级灰度 → 纯黑 + 纯白,一共 2 个台阶(1 bit)
- 8 级灰度 → 0, 36, 73, 109, 146, 182, 219, 255(3 bit)
- 256 级灰度 → 0–255,共 256 个台阶(8 bit)
uint8是“Unsigned Integer, 8 bit”的缩写,含义一句话:无符号、8 位、整型数字,只能放 0–255 的整数。
图像操作
反色
1 | J=255-I; |
提取通道
matlab
1 | r = Image1(:,:,1); |
分别提取rgb三个通道
opencv
1 | matlab:g = Image1(1,1,2)提取G通道的第一个像素点 |
opencv是从下标0开始
合并通道
NTSC 标准
1 | Y = 0.299*r + 0.587*g + 0.114*b; |
0.299、0.587、0.114 是 NTSC 在 1953 年定下的“亮度加权系数”,源于人眼三种视锥细胞对 R、G、B 光谱的灵敏度——绿最亮、红次之、蓝最暗
二值化(阈值 0.3)
1 | BW = zeros(size(Y)); % 先全黑 |
从RGB颜色空间转换成HSI颜色空间
matlab
1 | hsi = rgb2hsv(img); |
HSI 颜色空间是把一幅彩色图像的每个像素拆成 3 个独立、且更符合人眼感知习惯的物理量:
- H(Hue,色调) 用 0°–360° 的“角度”表示“到底是什么颜色”。 例:0°≈红,120°≈绿,240°≈蓝,绕一圈回到红。
- S(Saturation,饱和度) 0–1(或 0–100%)表示“颜色有多鲜艳”。 0 → 灰,1 → 最纯、最艳。
- I(Intensity,亮度/强度) 0–1(或 0–255)表示“有多亮”,与颜色本身无关,只反映明暗。
- RGB 是“机器友好”的立方体坐标,但人眼很难从 (R,G,B) 直接说出“颜色、多艳、多亮”。
matlab基本操作
获取图像行列和通道数
1 | [N,M,~]=size(r); |
把二维矩阵 r 的“行数”赋给
N,“列数”赋给 M。
截取图像
1 | newimage=img(H/4:H*3/4,W/4:W*3/4,:); |
人脸肤色检测
YCrCb 阈值法
Y “Luma”——亮度(Luminance)。 对应人眼最敏感的黑↔︎白信息,决定了你看到的“明暗”。 计算公式近似:
1
Y = 0.299·R + 0.587·G + 0.114·B
Cr “Chroma-red”——红色色度。 表示 红色与亮度的差值:
Cr = R – YCb “Chroma-blue”——蓝色色度。 表示 蓝色与亮度的差值:
Cb = B – Y
人眼对 绿色最敏感,对 红、蓝最迟钝。 把“绿色”信息扔掉,只保留 R-Y 和 B-Y 两个差值,就能 最小化数据量,同时 还能把颜色还原回来。
- 人类肤色在 YCrCb 颜色空间呈明显的“聚类”特性:无论人种如何,Cb、Cr 两个色度分量都落在狭长带状区域。
- 选取经验区间(Cr ∈ [133,173],Cb ∈ [77,127])直接做 2D 门限,亮度 Y 不参与判断,因此对光照强度变化不敏感,但对色偏敏感。
1 | def skin_YCrCb(img): |
HSV 阈值法
肤色聚类现象 大量统计表明:
- 不同人种、不同光照 的肤色在 RGB 空间里沿对角线“灰度轴”散开 → 亮度影响大。
- 转到 HSV 后,Hue 坐标紧紧挤在 0-20° 之间(红-橙-黄),S 中等偏高,V 中等偏亮
1 | def skin_HSV(img): |
椭圆模型法
原理:将RGB图像转换到YCRCB空间,肤色像素点会聚集到一个椭圆区域。先定义一个椭圆模型,然后将每个RGB像素点转换到YCRCB空间比对是否再椭圆区域,是的话判断为皮肤。
1 | # ---------------- 3. 椭圆模型法 ---------------- |
将彩色图像 Image1 的 R、B 通道互换
1 | img_swap = img(:,:,[3 1 2]); |
在 MATLAB 中,读取彩色图像(如用
imread)默认是 RGB 顺序:
- 第1通道:Red(红)
- 第2通道:Green(绿)
- 第3通道:Blue(蓝)
但在 OpenCV(Python/C++) 中,图像默认是 BGR 顺序:
- 第1通道:Blue
- 第2通道:Green
- 第3通道:Red
使用或操作,进行图像的嵌入
1 | clear; clc; close all; % 清空所有变量 |
利用单尺度和多尺度 Retinex 增强方法实现图像增强
1 | I = imread('gugong1.jpg'); |
直方图均衡化计算
5.4代码
opencv
1 | import numpy as np |