实现一个函数 s = scanLine4e(f, I, loc), 其中 f是一个灰度图像,I 是一个整数,loc 是一个字 符串。当 loc 为’row’时,I 代表行数。当 loc 为’column’时,I 代表列数。输出 s 是对应的相 关行或者列的像素灰度矢量。
调用该函数,提取 cameraman.tif 和 einstein.tif 的中心行和中心列的像素灰度矢量并将扫描 得到的灰度序列绘制成图。
1. 程序
①scanLine4e(f, I, loc)函数
function [s] = scanLine4e(f, I, loc) [row,column]=size(f); if loc=='row' % I 代表行数 s=f(I,:); elseif loc=='column' % I 代表列数 s=f(:,I); end end②主程序
img=imread("资源文件\cameraman.tif"); [centerRow,centerColum]=size(img); centerRow=round(centerRow/2); centerColum=round(centerColum/2); cameramanRow=scanLIne4e(img,centerRow,"row") cameramanColum=scanLIne4e(img,centerColum,"column") % 画图 x = linspace(0,256, 256); % 横坐标轴 y1 = cameramanRow; y2 = cameramanColum; % 绘图 figure plotyy(x, y1, x,y2) scanLIne4e(img,centerRow,"row")2.运行效果
①cameraman.tif图片
图1 cameraman.tif图片行列扫描
②einstein.tif图片
图2 cameraman.tif图片行列扫描
图像处理中的一个常见问题是将彩色RGB图像转换成单色灰度图像,第一种常用的方法是 取三个元素R,G,B 的均值。第二种常用的方式,又称为 NTSC 标准,考虑了人类的彩色感知体验,对于 R,G,B 三通道分别采用了不同的加权系数,分别是 R 通道 0.2989,G通道0.5870,B通道0.1140.
实现一个函数g = rgb1gray(f, method).函数功能是将一幅24位的RGB图像,f,转换成灰度图像,g.参数 method 是一个字符串,当其值为’average’ 时,采用 第一种转换方法,当其值为’NTSC’时,采用第二种转换方法。将’NTSC’做为缺省方式。
调用该函数,将提供的图像mandril_color.tif和 lena512color.tiff 用上述两种方法转换成单色 灰度图像,对于两种方法的结果进行简短比较和讨论。
1. 代码
①rgb1gray函数
function [outputArg] = rgb1gray(f, method) %函数g = rgb1gray(f, method).函数功能是将一幅24位的RGB图像,f,转换成灰度图像,g. %参数 method 是一个字符串,当其值为’average’ 时,采用 第一种转换方法, %当其值为’NTSC’时,采用第二种转换方法。将’NTSC’做为缺省方式。 %获取3通道 red=f(:,:,1); green=f(:,:,2); blue=f(:,:,3); gray=f; if method=='average' %采用 第一种转换方法:取三个元素R,G,B 的均值 gray=(red+green+blue)/3; elseif method=='NTSC' gray=0.2989*red+0.5870*green+0.1140*blue else outputArg = "输入参数method错误"; end outputArg = gray; end②主调用函数
img=imread("资源文件\mandril_color.tif"); gray=rgb1gray(img,"average"); imshow(gray)2.输出结果
①mandril_color.tif
图3(左) mandril_color.tif取3通道平均值作为灰度(右)加权NTSC模式
②lena512color.tiff
图4(左)lena512color图片取3通道平均值作为灰度(右)加权NTSC模式
3.结论
简单的将3通道的像素值进行平均后得到的灰度图会损失大量细节,图片变得几乎不可见,仅仅保留了少部分密集的深色区域。而用NTSC加权模式后得到的灰度图由于G通道占有最大的权重0.5870,绿色通道能保留较多的细节,因此灰度图在细节保留上几乎不受影响。
实现一个函数 g = twodConv(f, w), 其中 f是一个灰度源图像,w是一个矩形卷积核。要求输出图像g与源图像f大小(也就是像素的行数和列数)一致。请注意,为满足这一要求,对于源图像f需要进行边界像素填补(padding)。这里请实现两种方案。第一种方案是像素复制,对应的选项定义为‘replicate’,填补的像素拷贝与其最近的图像边界像素灰度。第二种方案是补零,对应的选项定义为‘zero’,填补的像素灰度为0,将第二种方案设置为缺省选择。
1.代码
①twodConv函数代码 function [outputArg] = twodConv(f, w,method) [size_w,t]=size(w) num=round(size_w/2) -1% 根据卷积核的大小决定要填充多少排 addrow=num*2