赞
踩
数字图像的生成与表示:对于自然界中的物体,通过某些成像设备,将物体表面的反射光或者通过物体的透射光,转换成电压,在成像平面生成图像。图像中目标的亮度取决于投影成目标的景物所受到的光照度、景物表面对光的反射程度以及成像系统的特性
图像信号的数字化:模拟图像转换为数字图像,方能被计算机处理,这一过程称为图像信号的数字化,包括:采样和量化
采样:对空间坐标x和y离散化,即确定水平和垂直方向上的像素数
量化:将各个像素所含的明暗信息离散化
一般的量化值为整数,量化层数取为2的n次幂
8位量化:也即
2
8
2^{8}
28,充分考虑到人眼的识别能力。非特殊用途的图像均为8bit量化,用[0 255]描述“从黑到白”,0和255分别对应亮度的最低和最高级别
在3bit以下的量化,会出现伪轮廓现象
如果要求更高精度,可以增大量化分层,但编码时占用位数也会增多,数据量加大
下图为数字化的灰度图像
下图为数字化的彩色图像
灰度图像: 每个像素只有一个强度值,呈现黑、灰、白等色
二值图像: 每个像素值要么为0要么为1的数字图像,一般为黑白两色
彩色图像: 每个像素值为三维向量,也即组成该色彩的RGB值
动态图像: 多帧位图的有序组合,使用动态原理,也即 Δ t ≤ 1 24 s \Delta t \leq \frac{1}{24}s Δt≤241s(视觉暂留时间), 产生连续活动视觉效果
索引图像: 索引图像实际上不是一种图像类型,而是图像的一种存储方式,牵涉到数据编码的问题。p具体的颜色数据存放在调色板中,图像数据区中存放对应每一个像素点的颜色索引值
数字图像的数值描述:所谓的数字图像的描述是指如何用一个数值方式来表示一幅图像。因为矩阵是二维的,所以可以用矩阵来描述数字图像。同时,前面我们已经提到,量化值是整数,因此描述数字图像的矩阵一定是整数矩阵
常用坐标系:如下图为矩阵坐标系、直角坐标系和像素坐标系对比
数字图像的数据结构:
JPEG格式:中文名为联合图片专家组开发,用于彩色图像的存储和网络传送
GIF格式:CompuServe公司开发,用于屏显和网络
TIFF格式:标记图像文件格式,Aldus公司开发,用于精确描述图像的场合
PNG格式:中文名便携式网络图形格式
BMP格式:Bitmap,Microsoft公司开发,用于Windows环境
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; //文件类型,必是”BM” 0x4D42
DWORD bfSize; //指定文件大小(单位:字节)
WORD bfReserved1; //保留字,不考虑
WORD bfReserved2; //保留字,不考虑
DWORD bfOffBits;
//从文件头到位图数据的偏移字节数
//sizeof(fileheader)+sizeof(infoheader)+sizeof(RGBQUAD)
} BITMAPFILEHEADER
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //本结构的长度,40个字节
DWORD biWidth; //图像宽,单位是像素
DWORD biHeight; //图像高,单位是像素
WORD biPlanes; //必须是1(位平面)
WORD biBitCount ;//颜色位数,1,4,8,24
DWORD biCompression; //压缩类型
DWORD biSizeImage; //实际位图数据占用的字节数
DWORD biXPelsPerMeter; //水平分辨率
DWORD biYPelsPerMeter; //垂直分辨率
DWORD biClrUsed; //实际使用的颜色数
DWORD biClrImportant; //重要的颜色数
} BITMAPINFOHEADER;
如下为256色的图像文件头及信息头
如下为真彩色24位的图像文件头及信息头
RGBQUAD结构指的是一种颜色的构成,调色板中有多少种颜色就有多少种这种结构。例如:图像只有纯红和纯蓝两种颜色,调色板数据为:0 0 255 0 | 255 0 0 0
typedef struct tagRGBQUAD
{
BYTE rgbBlue; //该颜色的蓝色分量
BYTE rgbGreen; //该颜色的绿色分量
BYTE rgbRed; //该颜色的红色分量
BYTE rgbReserved; //保留值,不考虑
} RGBQUAD;
W=biWidth*biBitCount/8
,但实际上p要求W是4的倍数,不足的补0如下图为灰度Lena图像调色板及图像数据
如下图为彩色Bird图像数据
MATLAB
imread
imshow
imwrite
rgb2gray
rgb2hsv
rgb2ycbcr
Python:
imread
:使用OpenCV读取图像,可以使用 cv2.imread()
函数。imshow
:使用OpenCV显示图像,可以使用 cv2.imshow()
函数。imwrite
:使用OpenCV保存图像,可以使用 cv2.imwrite()
函数。rgb2gray
:将RGB彩色图像转换为灰度图像,可以使用 cv2.cvtColor()
函数与 cv2.COLOR_RGB2GRAY
参数来进行转换。rgb2hsv
:将RGB彩色图像转换为HSV图像,可以使用 cv2.cvtColor()
函数与 cv2.COLOR_RGB2HSV
参数来进行转换。rgb2ycbcr
:将RGB彩色图像转换为YCbCr图像,可以使用 cv2.cvtColor()
函数与 cv2.COLOR_RGB2YCrCb
参数来进行转换MATLAB:
①:打开图像取反并显示和存储
I=imread('cameraman.jpg');
J=255-I;
subplot(121),imshow(I),title('原始图像');
subplot(122),imshow(J),title('反色图像');
imwrite(J,'cameraman反色.jpg');
②:打开彩色图像,灰度化和二值化
Image1=im2double(imread('lotus.jpg'));
r=Image1(:,:,1);
g=Image1(:,:,2);
b=Image1(:,:,3);
Y=0.299*r+0.587*g+0.114*b;
subplot(131),imshow(Y),title('亮度图Y');
I=(r+g+b)/3;
subplot(132),imshow(I),title('亮度图I');
BW=zeros(size(Y));
BW(Y>0.3)=1;
subplot(133),imshow(BW),title('二值化图');
Python OpenCV:
注意
imread()
函数调用时需要将第二个参数设置为 cv2.IMREAD_GRAYSCALE
imshow()
函数中的 cmap
参数设置为 'gray'
才能正确地显示灰度图像①:打开图像取反并显示和存储
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
I = cv2.imread('cameraman.jpg', cv2.IMREAD_GRAYSCALE)
J = 255-I
plt.subplot(121), plt.imshow(I, cmap='gray'), plt.title('原始图像')
plt.subplot(122), plt.imshow(J, cmap='gray'), plt.title('反色图像')
cv2.imwrite('cameraman反色.jpg', J)
plt.show()
②:打开彩色图像,灰度化和二值化
import cv2 import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] img = cv2.imread('lotus.JPG').astype(np.float32)/255 b, g, r = cv2.split(img) Y=0.299*r+0.587*g+0.114*b plt.subplot(131), plt.imshow(Y, cmap='gray'), plt.title('亮度图Y'), plt.axis('off') I=(r+g+b)/3 plt.subplot(132), plt.imshow(I, cmap='gray'), plt.title('亮度图I'), plt.axis('off') _, BW = cv2.threshold(Y, thresh=0.3, maxval=1.0, type=cv2.THRESH_BINARY) plt.subplot(133), plt.imshow(BW, cmap='gray'), plt.title('二值化图'), plt.axis('off') plt.show()
打开人脸图像,利用色彩信息进行肤色检测
MATLAB:
这段MATLAB代码是一个肤色检测的程序,它接受一张图片作为输入,通过分别在RGB、HSV和YCbCr三个颜色空间中检测像素点是否属于肤色,并输出相应的二值图。其中,对于YCbCr空间的检测,采用了高斯模型来对肤色的分布进行建模。具体实现过程如下:
clear,clc,close all; Image=imread('motheranddaughter.jpg'); r=double(Image(:,:,1)); g=double(Image(:,:,2)); b=double(Image(:,:,3)); [N,M]=size(r); miu=[117.4361 156.5599]'; % 定义肤色在YCbCr空间下的高斯分布的均值miu(行向量) sigma=[160.1301 12.1430;12.1430 299.4574]; % 定义协方差矩阵(列向量) cbcr=zeros(2,1); SkinCbCrG=zeros(N,M); % 初始化一个与图像大小相同的矩阵 SkinCbCrG,用于表示 YCbCr 检测结果中检测到的肤色部分 SkinRGB=zeros(N,M); % 初始化一个与图像大小相同的矩阵 SkinRGB,用于表示 RGB 检测结果中检测到的肤色部分 SkinHSV=zeros(N,M); % 初始化一个与图像大小相同的矩阵 SkinHSV,用于表示 HSV 检测结果中检测到的肤色部分 SkinCbCr=zeros(N,M); % 初始化一个与图像大小相同的矩阵 SkinCbCr,用于表示 YCbCr 检测结果中检测到的肤色部分 thresh=0.35; % 设定YCbCr检测中的偏移参数 for i=1:M % 对于每一行 for j=1:N % 对于每一列 R=r(j,i); G=g(j,i); B=b(j,i); if (R>95 && G>40 && B>20 && (R-G)>15 && R-B>15) || ... (R>220 && G>210 && B>170 && R-B<=15 && R>B && G>B) SkinRGB(j,i)=1; % 判断是否是肤色,如何是设置为1 end maxRGB=max(max(R,G),B); minRGB=min(min(R,G),B); C=maxRGB-minRGB; V=maxRGB; if V==0 S=0; else S=C/V; end if maxRGB==R H=60*mod((G-B)/C,6); elseif maxRGB==G H=60*((B-R)/C+2); elseif maxRGB==B H=60*((R-G)/C+4); end if ((H>=0 && H<=25) || (H>=335 && H<=360)) && (S>=0.2 && S<=0.6) && V>=0.4 SkinHSV(j,i)=1; end R=R/255;G=G/255;B=B/255; Cb=224*(-0.1687*R-0.3313*G+0.5*B)+128; Cr=224*(0.5*R-0.4187*G-0.0813*B)+128; if Cb>=77 && Cb<=127 && Cr>=133 && Cr<=173 SkinCbCr(j,i)=1; end cbcr= [Cb Cr]'; p=exp(-0.5*((cbcr-miu)')*(inv(sigma))*(cbcr-miu)); if p>thresh SkinCbCrG(j,i)=1; end end end subplot(151),imshow(Image),title('原图'); subplot(152),imshow(SkinRGB),title('RGB'); subplot(153),imshow(SkinHSV),title('HSV'); subplot(154),imshow(SkinCbCr),title('YCbCr'); subplot(155),imshow(SkinCbCrG),title('YCbCr'); imwrite(SkinRGB,'skinrgb3.jpg'); imwrite(SkinHSV,'skinhsv3.jpg'); imwrite(SkinCbCr,'skincbcr3.jpg'); imwrite(SkinCbCrG,'skinCbCrG3.jpg');
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。