zoukankan      html  css  js  c++  java
  • Matlab 图像的邻域和块操作

    图像的邻域操作是指输出图像的像素点取值,由输入图像的某个像素点及其邻域内的像素,通常像素点的邻域是一个远小于图像本身尺寸、形状规则的像素块,如2×2,3×3正方形、2×3矩形等,或者近似圆形的多边形。在Matlab中,提供了几个实现邻域操作的函数:

    • 通用滑块邻域操作函数:nlfilter(),语法包括:

      • B = nlfilter(A, [m n], fun):输入灰度图像A,返回图像B,按照尺寸m× n滑动邻域,利用运算函数fun处理后得到结果。其中fun是一个传入m × n矩阵输出一个标量的函数,可以是meanmean2stdstd2minmax等Matlab自带的函数,或者使用inline自定义的函数。

      • B = nlfilter(A, 'indexed', ...):该函数中返回图像B,它是输入的索引图像A填充后的结果。如图像A的数据类型是浮点型,则用”1”填充;如果是逻辑型或者无符号整型,则用 “0”填充。

    以lena图为例:



    lena.jpg


    clc; clear all; close all;
    
    A = imread('lena.jpg');
    A1 = im2double(A);
    B1 = nlfilter(A1, [4 4], 'std2');
    fun = @(x) max(x(:));
    B2 = nlfilter(A1, [3 3], fun);
    B3 = nlfilter(A1, [6 6], fun);
    figure(1);
    subplot(1, 3, 1), imshow(B1);
    subplot(1, 3, 2), imshow(B2);
    subplot(1, 3, 3), imshow(B3);


    • 分离邻域操作函数:blockproc(),语法包括:
      • B = blockproc(A, [m n], fun):该函数中对输入图像A,采用尺寸m×n分离块,利用运算函数fun处理,处理后的结果为输出图像B
      • B = blockproc(src_filename, [m n], fun):与上面函数的语法相似,但是同时读取和处理名为src_filename的图像,处理时将图像的一个分块读入内存,这个调用方式对于大图像非常有效,如果输出矩阵B过大,则可以使用参数Destination,将处理结果直接写入该文件中。
      • B = blockproc(adapter, [M N], fun):用于处理用户自己定义的图像格式,adapter是读写图像的接口函数。
      • blockproc(..., Name, Value, ...):该函数中按照Name-Value的方式对于像进行分离块处理,Name-Value取值可以查找Matlab的help文档。

    其中关于块的一些定义如下:

    变量 含义
    block_struct.border 是一个两元素向量[V H],说明矩阵的垂直和水平结构
    block_struct.blockSize 是一个两元向量[rows cols]说明块的尺寸
    block_struct.data 是一个M × NM× N ×P的矩阵
    block_struct.imageSize 是一个两元向量[row col]说明输入图像的尺寸
    block_struct.location 是一个两元向量[row col]说明输入图像的块数据中第一像素的位置


    I = imread('peppers.png');
    fun = @(block_struct) block_struct.data(:,:,[2 1 3]);
    blockproc(I, [64 64], fun, 'Destination', 'grb_peppers.tif');
    
    subplot(1, 2, 1), imshow(I);
    subplot(1, 2, 2), imshow('grb_peppers.tif');



    peppers.png(图左),grb_peppers.tif(图右)


    • 列方向邻域操作函数:colfilt(),语法包括:
      • B = colfilt(A, [m n], block_type, fun):该函数中将输入图像A,按照尺寸m×n块重新组合成一个临时矩阵,利用fun函数对这个临时矩阵处理,如果需要填充,则使用“0”填充。其中block_type是个字符串,可以取distinctsliding,取distinct按照分离邻域的方式
      • B = colfilt(A, [m n], [mblock nblock], block_type, fun)
      • B = colfilt(A, 'indexed', ...)
  • 相关阅读:
    07-2. A+B和C (15)
    07-1. 换个格式输出整数 (15)
    07-0. 写出这个数 (20)
    06-3. 单词长度(15)
    06-2. 字符串字母大小写转换(10)
    06-1. 简单计算器(20)
    06-0. 混合类型数据格式化输入(5)
    05-3. 求a的连续和(15)
    05-2. 念数字(15)
    05-1. 约分最简分式(15)
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332218.html
Copyright © 2011-2022 走看看