%读取并显示原图
image_rgb=imread('woman1.jpg')
image_ycbcr=rgb2ycbcr(image_rgb)%将RGB色彩值变换为YcbCr色彩空间(将RGB真彩色图像转化为YcbCr色彩空间中相等的图像)
y=image_ycbcr(:,:,1) %这三行分别是Ycbcr空间的y,cb,cr对应矩阵
cr=image_ycbcr(:,:,2)
cb=image_ycbcr(:,:,3)
[W,H]=size(y)% y对应矩阵大小
image_face=zeros(W,H)%创建和原图等大的矩阵用来存放接下来二值化人脸数据
%以下循环是根据设定的阈值把人脸转换成二值图像
for x1=1:W %%%%%%%%(cb=( 100,140),cr=(70,160)这是阈值,这个阈值应该是人脸肤色的范围
for y1=1:H
if (cb(x1,y1)>=70)&&(cb(x1,y1)<=140)&&(cr(x1,y1)>=80)&&(cr(x1,y1)<=170)
image_face(x1,y1)=0
else
image_face(x1,y1)=255
end
end
end
figure(1),imshow(image_face) %显示初步转换成二值图像的人脸
%%%%%%%%% 找到人脸区域并设为白色%%%% (r=35)
se1=strel('square',35) %这个函数可以创建边长35的方形元素
fo=imclose(image_face,se1) %利用上面创建的方形元素,弥补figure(1)中人脸中以及其他部分残留的小块黑色
figure(2),imshow(fo) %显示修补漏洞后的人脸
log=logical(fo) %生成一个逻辑索引矩阵,为非零元素时返回1,否则返回0。用于把figure(2)中黑色部分记录为0,这样对非人脸部分做修改也不会影响人脸
r=image_rgb(:,:,1) %这个是rgb空间三维的数据
g=image_rgb(:,:,2)
b=image_rgb(:,:,3)
r(log==0)=255 %根据前面的逻辑数据把之前的黑色部分对应位置设为255,以后显示RGB图时,非人脸部分就是白色啦
g(log==0)=255
b(log==0)=255
face_rgb=cat(3,r,g,b)%把修改后的RGB矩阵重组
figure(3),imshow(face_rgb),title('face_rgb')% 显示非人脸部分已经转白的RGB图
afm = rgb2gray(face_rgb) % rgb图转灰度图
figure(4), imshow(afm), title('surface image') % 显示人脸灰度图
这个是我个人加的注释 不知道你能不能理解 不能理解可以追问 我们一起学习下 哈哈 我也是新手
Y= 0.257*R + 0.504*G + 0.098*B + 16Cb = -0.148*R - 0.291*G+ 0.439*B + 128
Cr = 0.439*R - 0.368*G - 0.071*B + 128
Y = floor(Y+0.5)%四舍五入,取整
Cr = floor(Cr+0.5)
Cb = floor(Cb+0.5)
下面是转换回去的公式,验证是否转换正确,数据是否有损失。
R = 1.164*(Y-16) + 1.596*(Cr-128)
G = 1.164*(Y-16) - 0.813*(Cr-128) - 0.392*(Cb-128)
B = 1.164*(Y-16) + 2.017*(Cb-128)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)