MATLAB 编程/高级主题/工具箱和扩展/图像处理工具箱
核心 MATLAB 包附带了一些基本的函数(将在后面介绍),这些函数可用于加载、保存图像以及对图像执行自定义函数。但是,通常需要对图像执行更复杂的操作。图像处理工具箱允许进行以下操作:
以及其他许多操作。
要将图像加载到 MATLAB 中,您可以使用“导入数据”GUI(与文本文件或类似文件相同),也可以使用“imread”函数。要使用“imread”,您必须将图像所在的目录添加到目录列表中。然后使用以下语法:
>> myimage = imread('myimage.extension');
建议使用分号,尤其是这里,因为图像包含大量数据。
如果图像为彩色图像,MATLAB 默认情况下会将图像数据转换为 RGB 色彩空间(对于大多数与之兼容的数据格式)。单独的通道由图像的第三维表示。以下代码分离了图像的通道并指示每个通道的颜色。
>> redchannel = myimage(:,:,1); >> greenchannel = myimage(:,:,2); >> bluechannel = myimage(:,:,3);
MATLAB 中的另一个默认函数可用于将图像保存到新文件。函数“imwrite”接受两种不同的语法:
>> imwrite(myimage, 'nameoffile.extension')
或者
>> imwrite(myimage, 'nameoffile', 'extension')
使用第二种语法时,不要在扩展名之前使用句点。有关导入和导出的支持文件类型,请参见 MATLAB 文档。
默认情况下,MATLAB 将大多数图像导入为uint8 类,该类不受原生加法、减法、乘法或除法函数的支持。为了克服这个问题,一种选择是将图像转换为double 类。但是,如果要使用大量图像,或者图像很大,这会导致内存问题。这也很慢。因此,MATLAB 在其算术函数中提供了一个更好的选择。MATLAB 可以使用其专门用于整数的算术函数执行以下操作(如果 A 或 B 为常量值,它们也适用):
- imadd(A, B):添加两个图像 A 和 B(相当于 A + B,由于运算符重载,但这种语法在没有图像分析工具箱的情况下不起作用,因此不建议使用,因为它在没有工具箱的情况下会导致更难跟踪的错误,而不是“函数未找到”)
- imsubtract(A, B):减去两个图像 A 和 B(相当于 A - B,但同样不推荐使用,因为它在没有工具箱的情况下不起作用)
- immultiply(A, B):两个图像 A 和 B 的元素乘法。相当于 A.*B。
- imdivide(A, B):两个图像 A 和 B 的元素除法。相当于 A./B
- imlincomb(K1, A1, K2, A2, ..., C):图像 A1、A2 等的线性组合。这意味着您最终会得到 . 这比使用例如 更有效,因为后者在每次操作后都会进行舍入,这会导致有时会产生明显的错误,而前者只在最后进行舍入。
要可视化图像或图像的一部分,请使用imshow 函数:
>> imshow(myimage);
这将显示图像的图形(通常缩小)。您不应该尝试复制此图像并将其粘贴到另一个程序中,因为生成的 RGB 值将不同。请改用 imwrite。
请注意,从 RGB 等设备特定的色彩空间转换为 LAB 或 XYZ 等非设备特定的空间时,不可避免地会产生一些误差。原因之一是 MATLAB 提供的 RGB 值通常使用来自相机的伽马进行编码(并在显示在屏幕上之前由显示器提供另一个伽马),这使得 RGB 和 LAB 值之间的关系取决于相机的内部结构,并且是非线性的(且难以准确确定)。作为近似值,人们通常可以使用幂律函数来获得未修改的 RGB 值,理论上这些值应该与每个像素的 LAB 值线性相关。
请注意,这些方程式假设 R、G 和 B 的范围在 0 到 255 之间,计算需要将 R、G 和 B 从默认的 uint8 类转换为 double 类。
MATLAB 使用两种方法之一,相关性或卷积,来滤除各种图像。这两种操作除了卷积在滤波前将滤波器矩阵旋转 180 度外,其余部分相同,而相关性则保持不变。
直接卷积使用 conv2 方法和 imfilter 函数来实现。对于图像,由于滤波器远小于图像,因此 imfilter 中实现的直接方法(使用 MEX 函数来提高速度)通常更快。
可以证明,空间域中的卷积(如前所述)等效于傅里叶域中的乘法
其中 F 是傅里叶变换算子。如果 A 和 B 大小几乎相同,则对 A 和 B 都执行傅里叶变换,相乘,然后反转结果通常比直接执行计算更快。
为了使用此方法,需要用零填充 A 和 B 中较小的一个,以便 A 和 B 的大小相同。实际上,如果 A 和 B 都被填充以使其长度为 2 的幂,则此方法最快,因为 FFT 算法针对这些大小进行了优化。在形成填充后的矩阵 A' 和 B' 后,计算两个矩阵的 FFT(使用 fft2 函数),将它们相乘,然后反转它们以找到完整的卷积(填充了许多零)。以下是一些实现此方法的示例代码,并返回等效于 MATLAB 中 'same' 参数的卷积
滤波器可以用于以不同的方式模糊图像,或使其更清晰。函数 fspecial 包含许多您可以用于这些目的的预定义滤波器。此函数的语法为
>> filter = fspecial(typeoffilter, parameters);
如果没有提供参数,则滤波器的默认大小取决于滤波器的类型;有关详细信息,请参见 MATLAB 文档页面。其他类型的滤波器也具有其他选项,例如高斯滤波器中的标准差。
您也可以通过简单地将滤波器定义为矩阵来使用自己的滤波器。
为了滤除图像,MATLAB 用周围像素的加权平均值替换图像的每个像素。权重由滤波器的值决定,周围像素的数量由使用的滤波器的大小决定。MATLAB 包含一个用于执行滤波的函数:imfilter
>> newimage = imfilter(myimage, filter, parameters);
有几个可能的参数决定了 MATLAB 如何处理图像边缘的像素(因为边缘的加权平均值需要一些东西来权衡图像边界之外的东西)。这些包括用常量填充它(在 parameters 位置为 imfilter 提供一个数字),跨边界反射图像(parameters = 'symmetric'),假设图像具有周期性(parameters = 'circular'),或复制边界像素值(parameters = 'replicate')。要使用哪种最佳方法取决于应用程序,因此最好对其进行试验。
您可以传递的另一个参数是相关性与卷积的选择。相关性是默认使用的;将 'conv' 传递给 imfilter 以使用卷积。请注意,相关性将旋转您的滤波器,如果它打算对图像产生特定方向的影响,请做好准备。