当前位置:首页 > 代码 > 正文

图像四叉树划分代码(四叉树编码示意图)

admin 发布:2022-12-20 00:16 209


今天给各位分享图像四叉树划分代码的知识,其中也会对四叉树编码示意图进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

对比几种常见的栅格数据压缩编码的异同

栅格数据存储的压缩编码 1 直接编码 直接栅格编码是最简单最直观而又非常重要的一种栅格结构编码方法,通常称这种编码为图像文件或栅格文件。直接编码就是将栅格数据看作一个数据矩阵,逐行(或逐列)逐个记录代码,可以每行都从左到右逐象元记录,也可奇数行从左到右,而偶数行由右向左记录,为了特定目的还可采用其它特殊的顺序,右图直接编码可表示为矩阵: 2 链式编码 链式编码又称为弗里曼链码(Freeman,1961)或边界链码。由某一原点开始并按某些基本方向确定的单位矢量链。基本方向可定义为:东=0,南=3,西=2,北=1等。右图多边形边如果确定原点为像元(10,1),则该多边形界按顺时方向的链式编码为:

链式编码对多边形的表示具有很强的数据压缩能力,且具有一定的运算功能,如面积和周长计算等,探测边界急弯和凹进部分等都比较容易。但是,叠置运算如组合、相交等则很难实施,

3 行程编码 行程编码1 只在各行(或列)数据的代码发生变化时依次记录该代码以及相同代码重复的个数。左图可沿行方向进行行程编码: 行程编码2 逐个记录各行(或列)代码发生变化的位置和相应的代码,左图可沿列方向进行行程编码:

1列:(1,3),(3,1);

2列:(1,3),(4,1);

3列:(1,3),(5,1);

4列:(1,4),(2,3),(5,1);

5列:(1,4),(4,3),(6,2),(7,1);

6列:(1,4),(4,2);

7列:(1,4),(4,2);

8列:(1,4),(3,2)。 行程编码3 按行(或列)记录相同代码的始末象元的列号(或行号)和相应的代码,左图可沿行方向进行程编码:

4 块式编码 把多边形范围划分成由象元组成的正方形,然后对各个正方形进行编码。块式编码数据结构中包括3个数字:块的初始位置(行、列号)和块的大小(块包括的象元数),再加上记录单元的代码组成。左图块式编码:

5 四叉树编码2.1.6 栅格数据存储的压缩编码 1 直接编码 直接栅格编码是最简单最直观而又非常重要的一种栅格结构编码方法,通常称这种编码为图像文件或栅格文件。直接编码就是将栅格数据看作一个数据矩阵,逐行(或逐列)逐个记录代码,可以每行都从左到右逐象元记录,也可奇数行从左到右,而偶数行由右向左记录,为了特定目的还可采用其它特殊的顺序,右图直接编码可表示为矩阵: 2 链式编码 链式编码又称为弗里曼链码(Freeman,1961)或边界链码。由某一原点开始并按某些基本方向确定的单位矢量链。基本方向可定义为:东=0,南=3,西=2,北=1等。右图多边形边如果确定原点为像元(10,1),则该多边形界按顺时方向的链式编码为: 链式编码对多边形的表示具有很强的数据压缩能力,且具有一定的运算功能,如面积和周长计算等,探测边界急弯和凹进部分等都比较容易。但是,叠置运算如组合、相交等则很难实施, 3 行程编码 行程编码1 只在各行(或列)数据的代码发生变化时依次记录该代码以及相同代码重复的个数。左图可沿行方向进行行程编码: 行程编码2 逐个记录各行(或列)代码发生变化的位置和相应的代码,左图可沿列方向进行行程编码:1列:(1,3),(3,1); 2列:(1,3),(4,1); 3列:(1,3),(5,1); 4列:(1,4),(2,3),(5,1); 5列:(1,4),(4,3),(6,2),(7,1); 6列:(1,4),(4,2); 7列:(1,4),(4,2); 8列:(1,4),(3,2)。 行程编码3 按行(或列)记录相同代码的始末象元的列号(或行号)和相应的代码,左图可沿行方向进行程编码: 4 块式编码 把多边形范围划分成由象元组成的正方形,然后对各个正方形进行编码。块式编码数据结构中包括3个数字:块的初始位置(行、列号)和块的大小(块包括的象元数),再加上记录单元的代码组成。左图块式编码: 5 四叉树编码 四叉树分割 将图像区域按四个大小相同的象限四等分,每个象限又可根据一定规则判断是否继续等分为次一层的四个象限,无论分割到哪一层象限,只要子象限上仅含一种属性代码或符合既定要求的少数几种属性时,则停止继续分割。否则就一直分割到单个象元为止。按照象限递归分割的原则所分图像区域的栅格阵列应为2n×2n(n为分割的层数)的形式。 四叉树结构 把整个2n×2n象元组成的阵列当作树的根结点,树的高度为n级(最多为n级)。每个结点有分别代表南西(SW)、南东(SE)、北西(NW)、北东(NE)四个象限的四个分支。四个分支中要么是树叶,要么是树叉。树叶代表不能继续划分的结点,该结点代表子象限具有单一的代码;树叉不只包含一种代在码,必须继续划分,直到变成树叶为止。 四叉树编码 1 指针四叉树编码 通过在子结点与父结点之间设立指针的方式建立起整个结构。按这种方式,四叉树的每个结点通常存储6个量,即四个子结点指针、一个父结点指针和该结点的属性代码。这种方法除了要记录叶结点外,还要记录中间结点,一般要占用较大存储空间。 2 线性四叉树编码 为美国马里兰大学地理信息系统中采用的编码方法,该方法记录每个终止结点(或叶结点)的地址和值,值就是子区的属性代码,其中地址包括两部分,共32位(二进制),最右边4位记录该叶结点的深度,即处于四叉树的第几层上,有了深度可以推知子区大小;左边的28位记录路径,从右边第五位往左记录从叶结点到根结点的路径,0,1,2,3分别表示SW、SE、NW、NE。28位 4位 0 0 0 0 ... ... 0 0 0 0 1 1 1 0 0 0 1 1(路径0SW,3NE,2NW) 0 3 2 深度3记录了各个叶子的地址,再记录相应代码值,就记录了整个图像。 四叉树优点 1.容易而有效地计算多边形的数量特征; 2.阵列各部分的分辨率是可变的,边界复杂部分四叉树较高,即分级多,分辨率也高,而不需要表示许多细节的部分则分级少,分辨率低,因而既可精确表示图形结构又可减少存储量; 3.栅格到四叉树及到四叉树到简单栅格结构的转换比其他压缩方法容易; 4.多边形中嵌套异类多边形的表示较方便。 四叉树分割 将图像区域按四个大小相同的象限四等分,每个象限又可根据一定规则判断是否继续等分为次一层的四个象限,无论分割到哪一层象限,只要子象限上仅含一种属性代码或符合既定要求的少数几种属性时,则停止继续分割。否则就一直分割到单个象元为止。按照象限递归分割的原则所分图像区域的栅格阵列应为2n×2n(n为分割的层数)的形式。 四叉树结构 把整个2n×2n象元组成的阵列当作树的根结点,树的高度为n级(最多为n级)。每个结点有分别代表南西(SW)、南东(SE)、北西(NW)、北东(NE)四个象限的四个分支。四个分支中要么是树叶,要么是树叉。树叶代表不能继续划分的结点,该结点代表子象限具有单一的代码;树叉不只包含一种代在码,必须继续划分,直到变成树叶为止。 四叉树编码 1 指针四叉树编码 通过在子结点与父结点之间设立指针的方式建立起整个结构。按这种方式,四叉树的每个结点通常存储6个量,即四个子结点指针、一个父结点指针和该结点的属性代码。这种方法除了要记录叶结点外,还要记录中间结点,一般要占用较大存储空间。 2 线性四叉树编码 为美国马里兰大学地理信息系统中采用的编码方法,该方法记录每个终止结点(或叶结点)的地址和值,值就是子区的属性代码,其中地址包括两部分,共32位(二进制),最右边4位记录该叶结点的深度,即处于四叉树的第几层上,有了深度可以推知子区大小;左边的28位记录路径,从右边第五位往左记录从叶结点到根结点的路径,0,1,2,3分别表示SW、SE、NW、NE。

28位 4位

0 0 0 0 ... ... 0 0 0 0 1 1 1 0 0 0 1 1

(路径0SW,3NE,2NW) 0 3 2 深度3

记录了各个叶子的地址,再记录相应代码值,就记录了整个图像。 四叉树优点 1.容易而有效地计算多边形的数量特征; 2.阵列各部分的分辨率是可变的,边界复杂部分四叉树较高,即分级多,分辨率也高,而不需要表示许多细节的部分则分级少,分辨率低,因而既可精确表示图形结构又可减少存储量; 3.栅格到四叉树及到四叉树到简单栅格结构的转换比其他压缩方法容易; 4.多边形中嵌套异类多边形的表示较方便。

四叉树编码的名词解释是什么

四叉树编码的名词解释是什么

把地理空间定量划分为可变大小的网格,每个网格具有相同的属性。

将二维区域按照四个象限进行递归分割,直到子象限的数值单调为止。

四叉树编码是最有效的栅格数据压缩编码方法之一。其基本思想是首先把一幅图象或一幅栅格地图等分成四部分,如果检查到某个子区的所有格网都含有相同的值(灰度或属性值),那么这个子区域就不再往下分割;否则,把这个区域再分割成四个子区域,这样递归地分割,直至每个子块都只含有相同的灰度或属性值为止。

哪位能讲讲四叉树算法以及其实现原理

1、HMACSHA1的概念

HMACSHA1 是

从 SHA1 哈希函数构造的一种键控哈希算法,被用作 HMAC(基于哈希的消息验证代码)。此 HMAC

进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值与该密钥混合,然后再次应用哈希函数。输出的哈希值长度为 160

位,可以转换为指定位数。

上面是微软的标准定义,我看了也没太明白,他的作用一句话来理解:就是确认请求的URL或者参数是否存在被篡改,以

签名为例:发送方(自己)将参数等进行HMAC算法计算,将得到的哈希值(即签名值)与请求的参数一同提交至接收方(端),然后接收方再次将参数等值

进行HMAC算法计算,将得到的哈希值与你传递过来的哈希值进行核对验证,若一样,说明请求正确、验证通过,进行一下步工作,若不一样,将返回错误。

(下面说的够详细了吧,还不理解,留言给我)

2、 OAuth 1.0中用到的哈希算法

/// summary

/// HMACSHA1算法加密并返回ToBase64String

/// /summary

/// param name="strText"签名参数字符串/param

/// param name="strKey"密钥参数/param

/// returns返回一个签名值(即哈希值)/returns

public static string ToBase64hmac(string strText, string strKey)

{

HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.UTF8.GetBytes(strKey));

byte[] byteText = myHMACSHA1.ComputeHash(Encoding.UTF8.GetBytes(strText));

return System.Convert.ToBase64String(byteText);

}

或者写成,原理一样:

public static string HMACSHA1Text(string EncryptText, string EncryptKey)

{

//HMACSHA1加密

string message;

string key;

message = EncryptText;

key = EncryptKey;

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

byte[] keyByte = encoding.GetBytes(key);

HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);

byte[] messageBytes = encoding.GetBytes(message);

byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);

return ByteToString(hashmessage);

}

前面都注释了参数含义,就不再说明了。COPY就可使用

注明:页面请引用

using System.Security.Cryptography;

3、介绍另外一种HMACSHA1算法的写法

public static string HMACSHA1Text(string EncryptText, string EncryptKey)

{

//HMACSHA1加密

HMACSHA1 hmacsha1 = new HMACSHA1();

hmacsha1.Key = System.Text.Encoding.UTF8.GetBytes(EncryptKey);

byte[] dataBuffer = System.Text.Encoding.UTF8.GetBytes(EncryptText);

byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);

return Convert.ToBase64String(hashBytes);

}

求四叉树完整建立和遍历的运行代码(c或c++)

一个四叉树的实现代码

class QuadTreeCode

{

public:

vectorint m_Numbers;

/*判断两个四叉树码是否相等*/

bool operator ==( QuadTreeCode tempTree )

{

if ( m_Numbers.size()!=tempTree.m_Numbers.size() )

{

return false;

}

else

{

for ( int i=0; im_Numbers.size(); i++ )

{

if ( m_Numbers[i]!=tempTree.m_Numbers[i])

{

return false;

}

}

}

return true;

}

/*返回四叉树码的长度*/

int GetLength()

{

return m_Numbers.size();

}

int operator[](int Index)

{

return m_Numbers[Index];

}

};

enum ChildType

{

UL = 0,

UR = 3,

LL = 1,

LR = 2

};

templateclass T

class QuadTreeNode

{

public:

T *m_pData;

QuadTreeNode *m_pUpperLeft,*m_pUpperRight,*m_pLowerLeft,*m_pLowerRight;

QuadTreeCode m_Code; //节点在树中位置的编码

QuadTreeNode ()

{

m_pData = NULL;

m_pUpperLeft = m_pUpperRight = m_pLowerLeft = m_pLowerRight = NULL;

}

~QuadTreeNode ()

{

delete m_pData;

}

/*返回子成员的地址*/

QuadTreeNode ** GetChild( ChildType ctype )

{

switch( ctype )

{

case ChildType::UL:

return m_pUpperLeft;

break;

case ChildType::UR:

return m_pUpperRight;

break;

case ChildType::LL:

return m_pLowerLeft;

break;

case ChildType::LR:

return m_pLowerRight;

break;

}

}

};

templateclass T

class QuadTree

{

public:

int m_nTreeDepth; //树的深度

QuadTreeNodeT *m_pHeadNode; //树的头部

QuadTree()

{

m_nTreeDepth = 0;

m_pHeadNode = NULL;

}

~QuadTree()

{

void (QuadTree::*func)(QuadTreeNodeT *) ;

func = QuadTree::DestroyNode;

PostOrderOperation( m_pHeadNode, func );

}

/*

后序遍历方式操作四叉树

*/

void PostOrderOperation( QuadTreeNodeT * ptempNode, void (QuadTreeT::*NodeOp)( QuadTreeNodeT * ) )

{

if( ptempNode!=NULL )

{

PostOrderOperation( ptempNode-m_pLowerLeft, NodeOp );

PostOrderOperation( ptempNode-m_pLowerRight, NodeOp );

PostOrderOperation( ptempNode-m_pUpperLeft, NodeOp );

PostOrderOperation( ptempNode-m_pUpperRight, NodeOp );

(this-*NodeOp) ( ptempNode );

}

}

void DestroyNode( QuadTreeNodeT * ptempNode )

{

delete ptempNode;

}

/*创建树枝*/

void CreateBranch( QuadTreeNodeT**ppNode , int TreeDepth, int CurrentDepth )

{

if( CurrentDepthTreeDepth )

{

return;

}

else

{

QuadTreeNodeT *pNewNode = new QuadTreeNodeT;

*ppNode = pNewNode;

QuadTreeNodeT **pTempNode;

CreateBranch( pNewNode-GetChild(ChildType::UL), TreeDepth, CurrentDepth+1 );

CreateBranch( pNewNode-GetChild(ChildType::UR), TreeDepth, CurrentDepth+1 );

CreateBranch( pNewNode-GetChild(ChildType::LL), TreeDepth, CurrentDepth+1 );

CreateBranch( pNewNode-GetChild(ChildType::LR), TreeDepth, CurrentDepth+1 );

}

}

/*按照四叉树码进行操作*/

bool OperateNodeByCode( QuadTreeCode code, void (*Op)( QuadTreeNodeT *) )

{

QuadTreeNode* ptempNode = m_pHeadNode;

for( int i=0; icode.GetLength(); i++ )

{

ptempNode = ptempNode-GetChild( code[i] );

if( ptempNode==NULL )

return false;

}

Op( ptempNode );

return true;

}

/*近创建内存结构,数据内容并未赋值*/

void CreateTree( int TreeDepth )

{

m_nTreeDepth = TreeDepth;

CreateBranch( m_pHeadNode, TreeDepth, 0);

}

//virtual void CreateNode( QuadTreeNodeT * ptempNode ) const = 0;

};

matlab中四叉树分割函数qtdecomp,是将一幅图像分解成等大小的平方块,所以只能适用于“2的n次方像素图。

imresize()

一般来说会自动扩充为2^n的图。而且一般标准图都是2^n的,如512*512、4096*4096(医学图像)

matlab画函数图像怎么分析格图比重

MATLAB的影像处理工具箱支持多种标准的图像处理操作,以方便用户对图像进行分析和调整。这些图像处理操作主要包括: ①获取像素值及其统计数据; ②分析图像,抽取其主要结构信息; ③调整图像,突出其某些特征或抑制噪声

像素值及其统计

MATLAB的影像处理工具箱提供了多个函数以返回与构成图像的数据值相关的信息,这些函数能够以多种形式返回图像数据的信息,主要包括: ①选定像素的数据值(pixval函数和impixel函数); ②沿图像中某个路径的数据值(improfile函数); ③图像数据的轮廓图(imcontour函数); ④图像数据的柱状图(imhist函数); ⑤图像数据的摘要统计值(mean2函数、std2函数和corr2函数); ⑥图像区域的特征度量(imfeature函数)

像素选择 影像处理工具箱中包含两个函数可返回用户指定的图像像素的颜色数据值。 1) pixval函数 当光标在图像上移动时,该函数以交互的方式显示像素的数据值。另外,该函数还可以显示两个像素之间的Euclidean距离。

2) impixel函数 impixel函数可以返回选中像素或像素集的数据值。用户可以直接将像素坐标作为该函数的输入参数,或用鼠标选中像素。 例:

imshow canoe.tif;

val=impixel

对于索引图像,pixel函数和impixel函数都将其显示为存储在颜色映像中的RGB值而不是索引值。

强度描述图 在MATLAB影像处理工具箱中,提供了improfile函数用于沿着图像中一条直线段路径或直线路径计算并绘制其强度(灰度)值。 例:

imshow debyel.tif;

improfile

imshow canoe.tif;

improfile

例:

RGB=imread('flowers.tif');

figure(1);imshow(RGB);

improfile

图像轮廓图 在灰度图的轮廓图显示时,可利用MATLAB影像处理工具箱中的imcontour函数。该函数类似于contour函数,与contour函数相比,其功能更全。它能够自动设置坐标轴对象,从而使得其方向和纵横比能够与所显示的图形相匹配。 例:

I=imread('rice.tif');

imshow(I);

figure;imcontour(I)

I=imread('rice.png');

imshow(I);

figure;imcontour(I)

图像柱状图 图像柱状图可以用来显示索引图像或灰度图像中的灰度分布。可利用MATLAB影像处理工具箱中的imhist函数创建柱状图。 例:以前面介绍的大米灰度图为例来创建该图的柱状图。其代码如下:

I=imread('rice.tif');

imhist(I,64);

I=imread('rice.png');

imhist(I,64);

图像分析

MATLAB中的图像分析技术可以提取图像的结构信息。例如,可以利用影像处理工具箱提供的edge函数来探测边界。这里所谓的边界,其实就是图像中包含的对象所对应的位置。下面介绍几种常见图像分析函数。 1. 灰度图像的边缘:edge函数 该函数的语法如下:

BW=edge(I,method)

返回与I大小一样的二进制图像BW,其中元素I为发现I中的边缘。method为下列字符串之一: ‘sobel’:缺省值,用导数的sobel近似值检测边缘,那些梯度最大点返回边缘; ‘prewitt’:用导数的prewitt近似值检测边缘,在那些梯度最大点返回边缘; ‘roberts’:用导数的roberts近似值检测边缘,在那些梯度最大点返回边缘; ‘log’:使用高斯滤波器的拉普拉斯运算对I进行滤波,通过寻找0相交检测边缘。 ‘zerocross’:使用指定的滤波器对I滤波后,寻找0相交检测边缘。

BW=edge(I,method,thresh)

用thresh指定灵敏度阈值,所有不强于thresh的边缘都被忽略。

BW=edge(I,method,thresh,direction)

对于’sobel’和’prewitt’方法指定方向; direction为字符串:’horizontal’表示水平方向,’vertical’表示垂直方向,’both’两个方向(缺省值)。

BW=edge(I,’log’,thresh,sigma)

用sigma指定标准偏差。

[BW,thresh]=edge(…)。

行四叉树分解:qtdecomp函数 将一块图像分成四块等大小的方块,然后判断每块是否满足同性质的标准,如果满足,则不再分解,否则,再进行细分成四块,并对每块应用测试标准,分解过程重复迭代下去,直到满足标准,结果可能包含不同大小的块。该函数的语法结构如下:

S=qtdecomp(I)

对灰度图像I进行四叉树分解,返回四叉树结构的稀疏矩阵S。

S=qtdecomp(I,threshold)

如果块中元素最大值减去最小值大于threshold,则分解块。threshold为0到1之间的值。

S=qtdecomp(I,threshold,mindim)

如果块小于mindim就不再分解,无论其符合阈值条件与否

S=qtdecomp(I,threshold,[mindim maxdim])

如果块小于mindim或大于maxdim就不再分解,maxdim/mindim必须为2 的幂。

S=qtdecomp(I,FUN)

使用函数FUN确定是否分解块。

S=qtdecomp(I,FUN,P1,P2,…)

获取四叉树分解块值:qtdgetblk函数 该函数的语法结构如下:

[VALS,R,C]=qtdgetblk(I,S,dim)

VALS中对应dim×dim块的值取代I的四叉树分解中的每个dim×dim块。S由qtdecomp函数返回的稀疏矩阵,包含四叉树结构;VALS是dim×dim×k数组,k是四叉树的分解的dim×dim块的数量。如果没有指定大小的块,则返回一个空矩阵。R和C为包含块左上角行列坐标的向量。

[VALS,IDX]=qtdgetblk(I,S,dim)

返回块左上角直线索引的向量IDX。

设置四叉树分解块值:qtsetblk函数

J=qtsetblk(I,S,dim,VALS)

用VALS中对应dim×dim块的值取代I的四叉树分解中的每个dim×dim块。S由qtdecomp函数返回的稀疏矩阵,包含四叉树结构;VALS是dim×dim×k数组,k是四叉树的分解的dim×dim块的数量。

实例 1)图像分析中的灰度边缘检测实例

%调入与显示RGB图像

*RGB=imread('flowers.tif');

isrgb(RGB);

figure(1);imshow(RGB);

RGB=imread('autumn.tif');

isrgb(RGB);

figure(1);imshow(RGB);

% RGB图像转换为灰度图像

I=rgb2gray(RGB);

figure(2);imshow(I);

colorbar('horiz');

isgray(I);

% 边缘检测

ED=edge(I,'sobel',0.08);

figure(3);imshow(ED);

2) Sobel边界探测器和Canny边界探测器在图像分析中的应用实例 操作的对象仍以前面提到rice.tif图像为例。其代码如下:

I=imread('rice.tif');

I=imread('rice.png');

BW1=edge(I,'sobel');

BW2=edge(I,'canny');

figure(1);imshow(BW1);

figure(2);imshow(BW2);

图像调整

MATLAB中的图像高速技术用于图像的改善。此处的“改善”有两个方面的含义,即:客观方面,例如提高图像的信噪比;主观方面,例如通过修正图像的颜色和强度(灰度)使其某些特征更容易辨识。 1. 对比度增强 在MATLAB中,有关函数有: 1) 对比度调整函数:imadjust函数 该函数可用于调整灰度值或颜色图,其用法为:

J=imadjust(I,[low high],[bottom top],gamma)

将灰度图像I转换为图像J,使值从low到high与从bottom到top相匹配。值大于high或小于low的被剪去,即小于low的值与bottom相匹配,大于high的值与top相匹配。使用该函数时可将[low high]或[bottom top]指定为空矩阵[ ],此时缺省值为[0 1]。Gamma用来指定描述I和J值关系曲线的形状;gamma 1,越亮输出值越加强;gamma 1,越亮输出值越减弱;缺省gamma=1,表示线性变换。

newmap=imadjust(map,[low high],[bottom top],gamma)

对索引图像的颜色图进行变换。如果[low high]和[bottom top]均为2×3矩阵,则gamma为1×3向量,imadjust函数分别调整红、绿、蓝成分,调整后的颜色图newmap大小与原来的map一样。

RGB=imadjust(RGB1,…)

对RGB图像RGB1的每个图像块进行调整。与调整颜色图一样,通过指定[low high]和[bottom top]均为2×3矩阵,gamma为1×3向量,对每个图像块可以使用不同的参数值。如果top bottom,则图像颜色或灰度将倒置,即倒置变换,得到原图的底片。输入图像可以是uint8或双精度类型值,输出图像与输入图像类型一样。

2) 函数:brighten函数 该函数的用法为:brighten(beta) 使现有颜色图变成更亮或更暗的图。如果0 beta ≤1,则颜色图增亮;-1≤beta 0,则颜色图变暗。brighten(beta)可以使用brighten(-beta)还原。

MAP=brighten(beta)

返回当前使用的颜色图的更亮或更暗变换后的颜色图MAP,但不改变现有的显示。

NEWMAP=brighten(MAP,beta)

返回指定颜色图MAP的更亮或更暗变换后的新颜色图NEWMAP,但不改变显示。

brighten(FIG,beta)

增强图FIG的所有物体。

3) 直方图调整法 在MATLAB中,histeq函数用直方图均衡增强对比度。直方图均衡通过转换灰度图像亮度值或索引图像的颜色图值来增强图像对比度,输出图像的直方图近似与给定的直方图相匹配。

J=histeq(I,hgram)

转换灰度图像I,使输出图像J的直方图具有length(hgram)个条,近似与hgram相匹配。向量hgram包含等间隔条灰度值的整数计数个数。

J=histeq(I,N)

将灰度图像I转化成具有N个离散灰度级的灰度图像J,N缺省值为64。

[J,T]=histeq(I)

返回灰度级变换,使J的灰度级与I的灰度级相匹配。

NEWMAP=histeq(X,MAP,hgram)

变换索引图像X的颜色图,使索引图像(X,NEWMAP)的灰度级成分与hgram相匹配。返回变换后的颜色图NEWMAP,length(hgram)必须与size(MAP,1)一样。 输入图像可以是uint8或双精度类型。输出颜色图通常为双精度类型。输出T也是双精度类型。

图像平滑 图像平滑主要用于受干扰而质量降低的图像,在MATLAB图像处理工具箱中有关图像噪声的函数有: 1) 向图像增加噪声:imnoise函数 该函数的用法为:

J=imnoise(I,type,…)

向灰度图像I中增加type类型噪声。Type为下列字符串之一: ‘gaussian’:增加GAUSS白噪声; ‘salt pepper’:增加黑白像素点; ‘speckle’:增加乘法噪声。 根据类型再确定其他参数。

J=imnoise(I, ‘gaussian’,M,V)

在图像I中加入均值为M、方差为V的高斯白噪声。缺省值为0,方差为0.01的噪声。

J=imnoise(I, ‘salt pepper’,D)

在图像I中加入强度为D的“树盐”黑白像素点。其效果近似于:D*prod(size(I))像素。缺省强度为0.05。

J=imnoise(I, ‘speckle’,V)

使用公式J=I+n*I,向图像I中加入乘法噪声,其中n是均值为0,方差为V的均匀分布随机噪声。V缺省值为0.04。 图像I类型为uint8或双精度值,输出图像J与I类型一致。

2) 二维中值滤波器:medfilt2函数

B=medfilt2(A,[M N])

对矩阵A进行二维中值滤波。每个输出像素包含输入图像中相应像素周期的M×N邻域的中值。在图像边缘添加0,因此边缘在[M N]/2内的点可能发生扭曲。[M N]缺省值为[3 3]。

B=medfilt2(A,’indexed’,…)

将A当作索引图像处理,如果A为uint8类,填补0;如果A为双精度类,则填补1。

3) 状态统计滤波器:ordfilt2函数

Y=ordfilt2(X,order,domain)

由domain中非0元素指定邻域的排序集中的第order个元素代替X中的每个元素。Domain是一个仅包括0和1的矩阵,1仅定义滤波运算的邻域。

Y=ordfilt2(X,order,domain,S)

S与domain一样大,用与domain的非0值相应的S的值作为附加补偿。

4)二维自适应除噪滤波器:wiener2函数 wiener2函数估计每个像素的局部均值与方差,该函数用法如下:

J=wiener2(I,[M N],noise)

使用M×N大小邻域局部图像均值与偏差,采用像素式自适应滤波器对图像I进行滤波。

[J,noise]=wiener2(I,[M N])

滤波前还有估计附加噪声的能量。

特定区域处理

区域的指定

在进行图像处理时,有时只要对图像中某个特定区域进行处理,并不需要对整个图像进行处理。MATLAB中对特定区域的处理是通过二值掩模来实现的,通过选定一个区域后会生成一个与原图大小相同的二值图像,选定的区域为白色,其余部分为黑色。通过掩模图像,就可以实现对特定区域的选择性处理。下面介绍创建区域的方法: 1. 多边形选择方法 roipoly函数用于设定图像中的多边形区域,该函数返回与输入图像大小一致的二值图像BW,选中的区域值为1,其余的部分值为0。其语法格式为:

BW=roipoly(I,c,r)

其功能是:用向量c、r指定多边形各角点的X、Y轴的坐标。

BW=roipoly(I)

其功能是:是让用户交互选择多边形区域,通过点击鼠标设定多边形区域的角点,用空格键和Del键撤销选择,按Enter键确认选择,确认后该函数返回与输入图像大小一致的二值图像BW,在多边形区域内像素值为1,其余区域内像素值为0。

BW=roipoly(x,y,I,xi,yi)

其功能是:是用矢量x、y建立非默认的坐标系,然后在指定的坐标系下选择由向量xi、yi指定的多边形区域。

[BW,xi,yi]=roipoly(…)

其功能是:交互选择多边形区域,并返回多边形角点的坐标。

[x,y,BW,xi,yi]=roipoly(…)

其功能是:交互选择多边形区域后,还返回多边形顶点在指定的坐标系X-Y下的坐标。

例:根据指定的坐标选择一个六边形区域的程序清单:

I=imread('eight.tif');

c=[222 272 300 272 222 194];

r=[21 21 75 121 121 75];

BW=roipoly(I,c,r);

figure(1);imshow(I);

figure(2);imshow(BW);

其他选择方法 MATLAB图像处理工具箱中提供了可以实现按灰度选择区域的函数roicolor函数,其语法格式为:

BW=roicolor(A,low,high)

其功能是:按指定的灰度范围分割图像,返回二值掩模BW,[low,high]为所要选择区域的灰度范围。如果low大于high,则返回为空矩阵。

BW=roicolor(A,v)

其功能是:按向量v中指定的灰度值来选择区域。 下面是一个按灰度分割图像中的目标的程序清单:

I=imread('rice.tif');

I=imread('rice.png');

BW=roicolor(I,128,255);

figure(1);imshow(I);

figure(2);imshow(BW);

特定区域滤波

MATLAB图像处理工具箱中提供的roifilt2函数用于对特定区域进行滤波,其语法格式为:

J=roifilt2(h,I,BW)

其功能是:使用滤波器h对图像I中用二值掩模BW选中的区域滤波。

J=roifilt2(I,BW,fun)

J=roifilt2(I,BW,fun,P1,P2,…)

其功能是:对图像I中用二值掩模BW选中的区域作函数运算fun,其中fun是描述函数运算的字符串,参数为P1、P2、…。返回图像J在选中区域的像素为图像I经fun运算的结果,其余部分的像素值为I的原始值。

例:对指定区域进行锐化滤波的程序清单:

I=imread('eight.tif');

c=[222 272 300 272 222 194];

r=[21 21 75 121 121 75];

BW=roipoly(I,c,r);

h=fspecial('unsharp');

J=roifilt2(h,I,BW);

subplot(1,2,1);imshow(I);

subplot(1,2,2);imshow(J);

由运行结果可知:右上角的硬币发生了变化,而其他硬币保持不变。

特定区域填充

MATLAB图像处理工具箱中提供的roifill函数用于对特定区域进行填充,其语法格式为:

J=roifill(I,c,r)

其功能是:填充由向量c、r指定的多边形,c和r分别为多边形各顶点的X、Y坐标。它是通过解边界的拉普拉斯方程,利用多边形边界的点的灰度平滑的插值得到多边形内部的点。通常可以利用对指定区域的填充来“擦”掉图像中的小块区域。

J=roifill(I)

其功能是:由用户交互选取填充的区域。选择多边形的角点后,按Enter键确认选择,用空格键和Del键表示取消一个选择。

J=roifill(I,BW)

其功能是:用掩模图像BW选择区域。

[J,BW]=roifill(…)

其功能是:在填充区域的同时还返回掩模图像BW。

J=roifill(x,y,I,xi,yi)

[x,y,J,BW,xi,yi]=roifill(…)

其功能是:在指定的坐标系X-Y下填充由向量xi,yi指定的多边形区域。

例:下面是一个为填充指定的区域程序清单:

I=imread('rice.tif');

I=imread('rice.png');

c=[52 72 300 270 221 194];

r=[71 21 75 121 121 75];

J=roifill(I,c,r);

subplot(1,2,1);imshow(I);

subplot(1,2,2);imshow(J);

图形图像文件的读取

图形图像文件操作 相关的函数 已MAT文件加载或保存矩阵数据 Load、save 加载或保存图形文件格式的图像,如BMP、TIFF等 Imread、imwrite 显示加载到MATLAB7.0中的图像 Image、imagesc 信息查询 Imfinfo、ind2rgb

图形图像文件的读取

主要调用格式:

A=imread(filename,fmt) [X,map]=imread(filename,fmt)

[…]=imread(filename) […]=imread(URL, …)

[…]=imread(…,idx) (CUR,ICO,and TIFF only)

[…]=imread(…,idx) (CUR,ICO,and TIFF only)

[…]=imread(…,’frames’,idx) (GIFF only)

[…]=imread(…,ref) (HDF only)

[…]=imread(…,’BackgroundColor’,BG) (PNG only)

[A,map,alpha]=imread(…) (CUR,ICO,and PNG only)

最基本调用格式:

[X,map]=imread(filename,fmt)

*imread('rice.png','5'); %读取rice.png文件的第5帧图像

*RGB=imread(‘earth.jpg’);

%将图像earth.jpg读入MATLAB7.0工作平台,读取数据矩阵为变量RGB

图形图像文件的写入与显示

用imwrite来完成图形图像文件的写人操作: 基本调用格式:imwrite(X,map,filename,fmt)

load clown %根据MAP格式(MATLAB数据文件格式)装载图像

imwrite(X,map,'clown.jpg') %保存为一幅包含小丑图像的JPG文件

可用image函数显示图像,其语法格式:

image(C) image(x,y,C) image(…,’PropertyName’,PropertyValue, …)

image(’PropertyName’,PropertyValue, …) handle=image(…)

函数imagesc与image函数类似,但是它可以自动标度输入数据

load clown %根据MAP格式(MATLAB数据文件格式)装载图像

image(10,10,X) %显示一幅小丑图像,图像的左上角坐标为(0,0)

colormap(map) %

高级图像显示函数imshow,其语法格式为:

imshow(I,n) imshow(I,[low,high]) imshow(BW) imshow(X,map)

imshow(RGB) imshow(…,display_option) imshow(x,y,A, …) imshow filename

h=imshow(…)

I=imread('rice.png')

J=filter2([1 2;-1 -2],I) %用模板[1 2;-1 –2]对图像滤波

imshow(I)

figure,imshow(J,[])

用图像阅读器显示图像

图像阅读器的开关

1.在图像阅览器中显示图像:imview

moonfig=imread('moon.tif');

imview(moonfig)

imview('moon.tif')

指定图像的起始大小 (1) 设置Imviewinitialmaginfication属性为‘fit’,默认值为100,100%显示 (2) 在imview函数中使用Initialmagnification参数,指定值为“fit”。

imshow(X,map,'InitialMaginfication','fit')

关图像阅览器 直接单击窗口下的关闭按钮, 或用下面的语句关闭:imview close all

参考教材: 《数字图像处理及MATLAB实现》余成波编著 重庆大学出版社 TN911.73

关于图像四叉树划分代码和四叉树编码示意图的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/31824.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载