求matlab工具箱内的细化函数,二值图像细化

求matlab工具箱内的细化函数,二值图像细化,第1张

工具箱就是函数的集合吧,没有啥特殊的。把函数文件全部放到一个文件夹里,那后将该文件夹拷贝到matlab的toolbox文件夹下(在matlab安装路径中找),最后将该文件夹路径添加到matlab路径中(手动的话在preferens里设置,命令的话用addpath),就可以在任意位置使用这些函数了。

频域图像分析

1熟悉MATLAB软件的使用。

2掌握频域图像分析的原理及数学运算。

1自选一幅图像,并对其分别添加一定强度的周期噪声和高斯噪声,然后分别采用高斯模板、中值滤波的时域方法以及傅里叶变换和小波变换的频率滤波方法对该含噪图像进行去噪处理,并基于PSNR值和视觉效果这两个指标来比较这四种滤波方法对两种不同噪声的去噪能力。

2编写一个程序,要求实现下列算法:首先将阁像分割为8x8的子图像,对每个予图像进行FFT对每个了图像中的64个系数。按照每个系数的方差来排序后,舍去小的变换系数,只保留16个系数,实现4: I的图像压缩。

3给定一幅行和列都为2的整数次幕图像,用Haar小波基函数对其进行二维小波变换,试着将最低尺度近似分量置零再反变换,结果是什么如果把垂直方向的细节分量置零,反变换后结果又是什么呢试解释一下原因。

4基于小波变换对图像进行不同压缩比的压缩。在同压缩比情况下,对于基于小波变换和基于傅里叶变换的压缩结果,比较=二者保留原图像能里百分比情况。

Win10 64位电脑

MATLAB R2017a

1傅里叶变换

从纯粹的数学意义上看,傅里叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅里叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅里叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数。

傅里叶逆变换是将图像的频率分布函数变换为灰度分布函数傅里叶变换以前,图像(未压缩的位图)是由对在连续空间(现实空间)上的采样得到一系列点的集合,通常用一个二维矩阵表示空间上各点,记为z=f(x,y)。又因空间是三维的,图像是二维的,因此空间中物体在另一个维度上的关系就必须由梯度来表示,这样我们才能通过观察图像得知物体在三维空间中的对应关系。

2小波变换

小波变换是时间(空间)频率的局部化分析,它通过伸缩平移运算对信号(函数)逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节带噪声信号经过预处理,然后利用小波变换把信号分解到各尺度中,在每一尺度下把属于噪声的小波系数去掉,保留并增强属于信号的小波系数,最后再经过小波逆变换回复检测信号。

小波变换在去除噪声时可提取并保存对视觉起主要作用的边缘信息,而传统的基于傅里叶变换去除噪声的方法在去除噪声和边沿保持上存在着矛盾,因为傅里叶变换方法在时域不能局部化,难以检测到局域突变信号,在去除噪声的同时,也损失了图像边沿信息。由此可知,与傅里叶变换去除噪声的方法相比较,小波变换法去除噪声具有明显的性能优势。

3PSNR算法

peak的中文意思是顶点。而ratio的意思是比率或比列的。整个意思就是到达噪音比率的顶点信号,psnr一般是用于最大值信号和背景噪音之间的一个工程项目。通常在经过影像压缩之后,输出的影像都会在某种程度与原始影像不同。为了衡量经过处理后的影像品质,我们通常会参考PSNR值来衡量某个处理程序能否令人满意。它是原图像与被处理图像之间的均方误差相对于(2 n-1) 2的对数值(信号最大值的平方,n是每个采样值的比特数),它的单位是dB。

SNRP算法

haar基函数进行小波变换

七、实验结果与分析

图 1原图

1加入周期噪声、高斯噪声

2对添加了高斯噪声和周期噪声的图像进行高斯滤波

PSNR值

1对高斯噪声进行高斯滤波后 230287

2对周期噪声进行高斯滤波后 234837

2中值滤波

PSNR值:

1对高斯噪声进行中值滤波 239931

2对周期噪声进行中值滤波 243134

3傅里叶变换滤波

PSNR值:

1对添加了高斯噪声的图像进行傅里叶变换滤波 204922

2对添加了周期噪声的图像进行傅里叶变换滤波 189736

4小波变换滤波

PSNR值:

1对添加了高斯噪声的图像进行小波变换滤波 234712

2对添加了周期噪声的图像进行小波变换滤波 244525

分析:

对于高斯噪声,高斯滤波和傅里叶变换滤波声的除噪效果较好,中值滤波效果较差,小波变换滤波的处理效果也比较好

对于周期噪声,中值滤波和高斯滤波效果不是很好,傅里叶变换变换滤波对噪声的去处效果比较好,对于原图像损坏不大,小波变换对原图的损坏较大,但是可以看出噪声也去除的比较好。

5图像压缩(4:1压缩) 原图-左 压缩后-右

分析:

图像压缩算法就是先将一副图像分成很多小块,然后分别对这些小块进行变换,这里采用的是傅里叶变换,然后过滤掉冗余的像素点,然后再利用反变换得到压缩后的图像即可。

小波变换

1定义

小波变换是时间(空间)频率的局部化分析,它通过伸缩平移运算对信号(函数)逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节带噪声信号经过预处理,然后利用小波变换把信号分解到各尺度中,在每一尺度下把属于噪声的小波系数去掉,保留并增强属于信号的小波系数,最后再经过小波逆变换回复检测信号。

2优点

小波变换在去除噪声时可提取并保存对视觉起主要作用的边缘信息,而传统的基于傅里叶变换去除噪声的方法在去除噪声和边沿保持上存在着矛盾,因为傅里叶变换方法在时域不能局部化,难以检测到局域突变信号,在去除噪声的同时,也损失了图像边沿信息。由此可知,与傅里叶变换去除噪声的方法相比较,小波变换法去除噪声具有明显的性能优势。

Haar基函数进行小波变换

图 2原图

图 3 haar变换

图 4 haar反变换后

图 5 最低分量近似置零

图 6 垂直分量置零

小波变换进行图像压缩与傅里叶变换压缩对比

1压缩比 1:2(左-小波压缩 右-傅里叶压缩)

2压缩比 1:4(左-小波压缩 右-傅里叶压缩)

通过这次实验,学到了很多。特别是在傅里叶变换和小波变换等方面,开始的时候连傅里叶变换的基础基础也不懂,后来在csdn上看了一篇讲解傅里叶变换的文章,豁然开朗,傅里叶变换居然可以将一个时域信号转化到频域,而且自己还对与i有了更加深刻的理解。虽然傅里叶变换可以把信号从时域转换到频域,但是频域与时域的对应关系却无法一一对应,所以诞生了小波变换。小波变换的特别之处就是可以把一个时域上的信息转换为时域-频域一一对应,这对应特殊信号的提取是有很好的效果,在一定程度上比傅里叶变换更厉害。但是在傅里叶、小波等基础概念知识方面,自己还是涉猎的比较少,原理的论证公式太复杂了。

图像处理基本算法 *** 作从处理对象的多少可以有如下划分:

一)点运算:处理点单元信息的运算

二)群运算:处理群单元 (若干个相邻点的集合)的运算

1二值化 *** 作

图像二值化是图像处理中十分常见且重要的 *** 作,它是将灰度图像转换为二值图像或灰度图像的过程。二值化 *** 作有很多种,例如一般二值化、翻转二值化、截断二值化、置零二值化、置零翻转二值化。

2直方图处理

直方图是图像处理中另一重要处理过程,它反映图像中不同像素值的统计信息。从这句话我们可以了解到直方图信息仅反映灰度统计信息,与像素具体位置没有关系。这一重要特性在许多识别类算法中直方图处理起到关键作用。

3模板卷积运算

模板运算是图像处理中使用频率相当高的一种运算,很多 *** 作可以归结为模板运算,例如平滑处理,滤波处理以及边缘特征提取处理等。这里需要说明的是模板运算所使用的模板通常说来就是NXN的矩阵(N一般为奇数如3,5,7,),如果这个矩阵是对称矩阵那么这个模板也称为卷积模板,如果不对称则是一般的运算模板。我们通常使用的模板一般都是卷积模板。如边缘提取中的Sobel算子模板。

使图像边缘细化方法:

所需工具:ps

1、打开ps,用选择框选择要光滑的边缘对象。

2、在任务栏中选“选择”工具——>“平滑”,这时会出现一个选框(如下图),进行修改平滑选区的半径即可。

在MFC下自己构造一个DIB类实现上述功能还是有很多现成的代码~

下面就是一个构造的DIB类,但是仅仅提供了最基本的一些 *** 作,代码来自《Visual C++数字图像处理典型算法及实现》。// DibImageh: interface for the CDibImage class

//

//////////////////////////////////////////////////////////////////////

#if !defined(AFX_DIBIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_)

#define AFX_DIBIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

DECLARE_HANDLE(HDIB); // DIB句柄

#define PALVERSION 0x300 // DIB常量

/ DIB宏 /

// 判断是否是Win 30的DIB

#define IS_WIN30_DIB(lpbi) (((LPDWORD)(lpbi)) == sizeof(BITMAPINFOHEADER))

// 计算矩形区域的宽度

#define RECTWIDTH(lpRect) ((lpRect)->right - (lpRect)->left)

// 计算矩形区域的高度

#define RECTHEIGHT(lpRect) ((lpRect)->bottom - (lpRect)->top)

// 在计算图像大小时,采用公式:biSizeImage = biWidth' × biHeight。

// 是biWidth',而不是biWidth,这里的biWidth'必须是4的整倍数,表示

// 大于或等于biWidth的,离4最近的整倍数。WIDTHBYTES就是用来计算

// biWidth'

#define WIDTHBYTES(bits) (((bits) + 31) / 32 4)

// Dib文件头标志(字符串"BM",写DIB时用到该常数)

#define DIB_HEADER_MARKER ((WORD) ('M' << 8) | 'B')

class CDibImage

{

// Constructor and Destructor ///////////////////////////////

public:

CDibImage();

virtual ~CDibImage();

// function /////////////////////////////////////////////////

public:

BOOL PaintDIB (HDC, LPRECT, HDIB, LPRECT, CPalette pPal);

BOOL CreateDIBPalette(HDIB hDIB, CPalette cPal);

LPSTR FindDIBBits (LPSTR lpbi);

DWORD DIBWidth (LPSTR lpDIB);

DWORD DIBHeight (LPSTR lpDIB);

WORD PaletteSize (LPSTR lpbi);

WORD DIBNumColors (LPSTR lpbi);

HGLOBAL CopyHandle (HGLOBAL h);

BOOL SaveDIB (HDIB hDib, CFile& file);

HDIB ReadDIBFile(CFile& file);

};

#endif // !defined(AFX_DIBIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_)

///////////////////////////////////////////////////////////////////////

// DibImagecpp: implementation of the CDibImage class

// DIB(Independent Bitmap) 函数:

//

// PaintDIB() - 绘制DIB对象

// CreateDIBPalette() - 创建DIB对象调色板

// FindDIBBits() - 返回DIB图像象素起始位置

// DIBWidth() - 返回DIB宽度

// DIBHeight() - 返回DIB高度

// PaletteSize() - 返回DIB调色板大小

// DIBNumColors() - 计算DIB调色板颜色数目

// CopyHandle() - 拷贝内存块

//

// SaveDIB() - 将DIB保存到指定文件中

// ReadDIBFile() - 重指定文件中读取DIB对象

//////////////////////////////////////////////////////////////////////

#include "stdafxh"

#include "DIBDisplayh"

#include "DibImageh"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CDibImage::CDibImage()

{

}

CDibImage::~CDibImage()

{

}

//////////////////////////////////////////////////////////////////////

// function

//////////////////////////////////////////////////////////////////////

/

函数名称:

PaintDIB()

参数:

HDC hDC - 输出设备DC

LPRECT lpDCRect - 绘制矩形区域

HDIB hDIB - 指向DIB对象的指针

LPRECT lpDIBRect - 要输出的DIB区域

CPalette pPal - 指向DIB对象调色板的指针

返回值:

BOOL - 绘制成功返回TRUE,否则返回FALSE。

说明:

该函数主要用来绘制DIB对象。其中调用了StretchDIBits()或者

SetDIBitsToDevice()来绘制DIB对象。输出的设备由由参数hDC指

定;绘制的矩形区域由参数lpDCRect指定;输出DIB的区域由参数

lpDIBRect指定。

/

BOOL CDibImage::PaintDIB(HDC hDC,

LPRECT lpDCRect,

HDIB hDIB,

LPRECT lpDIBRect,

CPalette pPal)

{

LPSTR lpDIBHdr; // BITMAPINFOHEADER指针

LPSTR lpDIBBits; // DIB象素指针

BOOL bSuccess=FALSE; // 成功标志

HPALETTE hPal=NULL; // DIB调色板

HPALETTE hOldPal=NULL; // 以前的调色板

if (hDIB == NULL)

{

return FALSE;

}

lpDIBHdr = (LPSTR)::GlobalLock((HGLOBAL) hDIB);// 锁定DIB

lpDIBBits = FindDIBBits(lpDIBHdr); // 找到DIB图像象素起始位置

if (pPal != NULL) // 获取DIB调色板,并选中它

{

hPal = (HPALETTE) pPal->m_hObject;

hOldPal = ::SelectPalette(hDC, hPal, TRUE); // 选中调色板

}

::SetStretchBltMode(hDC, COLORONCOLOR); // 设置显示模式

// 判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象

if ((RECTWIDTH(lpDCRect) == RECTWIDTH(lpDIBRect)) &&

(RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect)))

{

// 原始大小,不用拉伸。

bSuccess = ::SetDIBitsToDevice(hDC, // hDC

lpDCRect->left, // DestX

lpDCRect->top, // DestY

RECTWIDTH(lpDCRect), // nDestWidth

RECTHEIGHT(lpDCRect), // nDestHeight

lpDIBRect->left, // SrcX

(int)DIBHeight(lpDIBHdr) -

lpDIBRect->top -

RECTHEIGHT(lpDIBRect), // SrcY

0, // nStartScan

(WORD)DIBHeight(lpDIBHdr), // nNumScans

lpDIBBits, // lpBits

(LPBITMAPINFO)lpDIBHdr, // lpBitsInfo

DIB_RGB_COLORS); // wUsage

}

else

{

// 非原始大小,拉伸。

bSuccess = ::StretchDIBits(hDC, // hDC

lpDCRect->left, // DestX

lpDCRect->top, // DestY

RECTWIDTH(lpDCRect), // nDestWidth

RECTHEIGHT(lpDCRect), // nDestHeight

lpDIBRect->left, // SrcX

lpDIBRect->top, // SrcY

RECTWIDTH(lpDIBRect), // wSrcWidth

RECTHEIGHT(lpDIBRect), // wSrcHeight

lpDIBBits, // lpBits

(LPBITMAPINFO)lpDIBHdr, // lpBitsInfo

DIB_RGB_COLORS, // wUsage

SRCCOPY); // dwROP

}

::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定

if (hOldPal != NULL)

{

::SelectPalette(hDC, hOldPal, TRUE); // 恢复以前的调色板

}

return bSuccess;

}

/

函数名称:

CreateDIBPalette()

参数:

HDIB hDIB - 指向DIB对象的指针

CPalette pPal - 指向DIB对象调色板的指针

返回值:

BOOL - 创建成功返回TRUE,否则返回FALSE。

说明:

该函数按照DIB创建一个逻辑调色板,从DIB中读取颜色表并存到调色板中,

最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。这样

可以用最好的颜色来显示DIB图像。

/

BOOL CDibImage::CreateDIBPalette(HDIB hDIB, CPalette pPal)

{

LPLOGPALETTE lpPal; // 指向逻辑调色板的指针

HANDLE hLogPal; // 逻辑调色板的句柄

HPALETTE hPal = NULL; // 调色板的句柄

int i; // 循环变量

WORD wNumColors; // 颜色表中的颜色数目

LPSTR lpbi; // 指向DIB的指针

LPBITMAPINFO lpbmi; // 指向BITMAPINFO结构的指针(Win30)

LPBITMAPCOREINFO lpbmc; // 指向BITMAPCOREINFO结构的指针

BOOL bWinStyleDIB; // 表明是否是Win30 DIB的标记

BOOL bResult = FALSE; // 创建结果

if (hDIB == NULL)

{

return FALSE;

}

lpbi = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); // 锁定DIB

lpbmi = (LPBITMAPINFO)lpbi; // 获取指向BITMAPINFO结构的指针(Win30)

lpbmc = (LPBITMAPCOREINFO)lpbi; // 获取指向BITMAPCOREINFO结构的指针

wNumColors = DIBNumColors(lpbi);// 获取DIB中颜色表中的颜色数目

if (wNumColors != 0)

{

// 分配为逻辑调色板内存

hLogPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)

+ sizeof(PALETTEENTRY)

wNumColors);

// 如果内存不足,退出

if (hLogPal == 0)

{

::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定

return FALSE;

}

lpPal = (LPLOGPALETTE) ::GlobalLock((HGLOBAL) hLogPal);

lpPal->palVersion = PALVERSION; // 设置版本号

lpPal->palNumEntries = (WORD)wNumColors;// 设置颜色数目

bWinStyleDIB = IS_WIN30_DIB(lpbi); // 判断是否是WIN30的DIB

// 读取调色板

for (i = 0; i < (int)wNumColors; i++)

{

if (bWinStyleDIB)

{

// 读取红色绿色蓝色分量

lpPal->palPalEntry[i]peRed = lpbmi->bmiColors[i]rgbRed;

lpPal->palPalEntry[i]peGreen = lpbmi->bmiColors[i]rgbGreen;

lpPal->palPalEntry[i]peBlue = lpbmi->bmiColors[i]rgbBlue;

// 保留位

lpPal->palPalEntry[i]peFlags = 0;

}

else

{

// 读取红色绿色蓝色分量

lpPal->palPalEntry[i]peRed = lpbmc->bmciColors[i]rgbtRed;

lpPal->palPalEntry[i]peGreen = lpbmc->bmciColors[i]rgbtGreen;

lpPal->palPalEntry[i]peBlue = lpbmc->bmciColors[i]rgbtBlue;

// 保留位

lpPal->palPalEntry[i]peFlags = 0;

}

}

bResult = pPal->CreatePalette(lpPal);// 按照逻辑调色板创建调色板,并返回指针

::GlobalUnlock((HGLOBAL) hLogPal); // 解除锁定

::GlobalFree((HGLOBAL) hLogPal); // 释放逻辑调色板

}

::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定

return bResult;

}

/

函数名称:

FindDIBBits()

参数:

LPSTR lpbi - 指向DIB对象的指针

返回值:

LPSTR - 指向DIB图像象素起始位置

说明:

该函数计算DIB中图像象素的起始位置,并返回指向它的指针。

/

LPSTR CDibImage::FindDIBBits(LPSTR lpbi)

{

return (lpbi + (LPDWORD)lpbi + PaletteSize(lpbi));

}

/

函数名称:

DIBWidth()

参数:

LPSTR lpbi - 指向DIB对象的指针

返回值:

DWORD - DIB中图像的宽度

说明:

该函数返回DIB中图像的宽度。对于Windows 30 DIB,返回BITMAPINFOHEADER

中的biWidth值;对于其它返回BITMAPCOREHEADER中的bcWidth值。

/

DWORD CDibImage::DIBWidth(LPSTR lpDIB)

{

LPBITMAPINFOHEADER lpbmi; // 指向BITMAPINFO结构的指针(Win30)

LPBITMAPCOREHEADER lpbmc; // 指向BITMAPCOREINFO结构的指针

lpbmi = (LPBITMAPINFOHEADER)lpDIB;

lpbmc = (LPBITMAPCOREHEADER)lpDIB;

// 返回DIB中图像的宽度

if (IS_WIN30_DIB(lpDIB))

{

return lpbmi->biWidth; // 对于Windows 30 DIB,返回lpbmi->biWidth

}

else

{

return (DWORD)lpbmc->bcWidth; // 对于其它格式的DIB,返回lpbmc->bcWidth

}

}

/

函数名称:

DIBHeight()

参数:

LPSTR lpDIB - 指向DIB对象的指针

返回值:

DWORD - DIB中图像的高度

说明:

该函数返回DIB中图像的高度。对于Windows 30 DIB,返回BITMAPINFOHEADER

中的biHeight值;对于其它返回BITMAPCOREHEADER中的bcHeight值。

/

DWORD CDibImage::DIBHeight(LPSTR lpDIB)

{

LPBITMAPINFOHEADER lpbmi; // 指向BITMAPINFO结构的指针(Win30)

LPBITMAPCOREHEADER lpbmc; // 指向BITMAPCOREINFO结构的指针

lpbmi = (LPBITMAPINFOHEADER)lpDIB;

lpbmc = (LPBITMAPCOREHEADER)lpDIB;

// 返回DIB中图像的宽度

if (IS_WIN30_DIB(lpDIB))

{

return lpbmi->biHeight; // 对于Windows 30 DIB,返回lpbmi->biHeight

}

else

{

return (DWORD)lpbmc->bcHeight; // 对于其它格式的DIB,返回lpbmc->bcHeight

}

}

/

函数名称:

PaletteSize()

参数:

LPSTR lpbi - 指向DIB对象的指针

返回值:

WORD - DIB中调色板的大小

说明:

该函数返回DIB中调色板的大小。对于Windows 30 DIB,返回颜色数目×

RGBQUAD的大小;对于其它返回颜色数目×RGBTRIPLE的大小。

/

WORD CDibImage::PaletteSize(LPSTR lpbi)

{

// 计算DIB中调色板的大小

if (IS_WIN30_DIB (lpbi))

{

//返回颜色数目×RGBQUAD的大小

return (WORD)(DIBNumColors(lpbi) sizeof(RGBQUAD));

}

else

{

//返回颜色数目×RGBTRIPLE的大小

return (WORD)(DIBNumColors(lpbi) sizeof(RGBTRIPLE));

}

}

/

函数名称:

DIBNumColors()

参数:

LPSTR lpbi - 指向DIB对象的指针

返回值:

WORD - 返回调色板中颜色的种数

说明:

该函数返回DIB中调色板的颜色的种数。对于单色位图,返回2,

对于16色位图,返回16,对于256色位图,返回256;对于真彩色

位图(24位),没有调色板,返回0。

/

WORD CDibImage::DIBNumColors(LPSTR lpbi)

{

WORD wBitCount;

// 对于Windows的DIB, 实际颜色的数目可以比象素的位数要少。

// 对于这种情况,则返回一个近似的数值。

// 判断是否是WIN30 DIB

if (IS_WIN30_DIB(lpbi))

{

DWORD dwClrUsed;

dwClrUsed = ((LPBITMAPINFOHEADER)lpbi)->biClrUsed; // 读取dwClrUsed值

if (dwClrUsed != 0)

{

// 如果dwClrUsed(实际用到的颜色数)不为0,直接返回该值

return (WORD)dwClrUsed;

}

}

// 读取象素的位数

if (IS_WIN30_DIB(lpbi))

{

wBitCount = ((LPBITMAPINFOHEADER)lpbi)->biBitCount; // 读取biBitCount值

}

else

{

wBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount; // 读取biBitCount值

}

// 按照象素的位数计算颜色数目

switch (wBitCount)

{

case 1:

return 2;

break;

case 4:

return 16;

break;

case 8:

return 256;

break;

default:

return 0;

break;

}

}

/

函数名称:

CopyHandle()

参数:

HGLOBAL h - 要复制的内存区域

返回值:

HGLOBAL - 复制后的新内存区域

说明:

该函数复制指定的内存区域。返回复制后的新内存区域,出错时返回0。

/

HGLOBAL CDibImage::CopyHandle (HGLOBAL h)

{

if (h == NULL)

{

return NULL;

}

DWORD dwLen = ::GlobalSize((HGLOBAL) h); // 获取指定内存区域大小

HGLOBAL hCopy = ::GlobalAlloc(GHND, dwLen); // 分配新内存空间

if (hCopy != NULL) // 判断分配是否成功

{

void lpCopy = ::GlobalLock((HGLOBAL) hCopy);

void lp = ::GlobalLock((HGLOBAL) h);

memcpy(lpCopy, lp, dwLen);

::GlobalUnlock(hCopy);

::GlobalUnlock(h);

}

return hCopy;

}

/

函数名称:

SaveDIB()

参数:

HDIB hDib - 要保存的DIB

CFile& file - 保存文件CFile

返回值:

BOOL - 成功返回TRUE,否则返回FALSE或者CFileException

说明:

该函数将指定的DIB对象保存到指定的CFile中。该CFile由调用程序打开和关闭。

/

BOOL CDibImage::SaveDIB(HDIB hDib, CFile& file)

{

BITMAPFILEHEADER bmfHdr; // Bitmap文件头

LPBITMAPINFOHEADER lpBI; // 指向BITMAPINFOHEADER的指针

DWORD dwDIBSize; // DIB大小

if (hDib == NULL)

{

return FALSE;

}

// 读取BITMAPINFO结构,并锁定

lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);

if (lpBI == NULL)

{

return FALSE;

}

// 判断是否是WIN30 DIB

if (!IS_WIN30_DIB(lpBI))

{

// 不支持其它类型的DIB保存

::GlobalUnlock((HGLOBAL) hDib);

return FALSE;

}

////////////////////////////////////////////////////////////////////////

// 填充文件头///////////////////////////////////////////////////////////

bmfHdrbfType = DIB_HEADER_MARKER; // 文件类型"BM"

// 计算DIB大小时,最简单的方法是调用GlobalSize()函数。但是全局内存大小并

// 不是DIB真正的大小,它总是多几个字节。这样就需要计算一下DIB的真实大小。

// 文件头大小+颜色表大小

// (BITMAPINFOHEADER和BITMAPCOREHEADER结构的第一个DWORD都是该结构的大小)

dwDIBSize = (LPDWORD)lpBI + PaletteSize((LPSTR)lpBI);

// 计算图像大小

if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4))

{

// 对于RLE位图,没法计算大小,只能信任biSizeImage内的值

dwDIBSize += lpBI->biSizeImage;

}

else

{

DWORD dwBmBitsSize; // 象素的大小

dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)((DWORD)lpBI->biBitCount))

lpBI->biHeight; // 大小为Width Height

dwDIBSize += dwBmBitsSize; // 计算出DIB真正的大小

// 更新biSizeImage(很多BMP文件头中biSizeImage的值是错误的)

lpBI->biSizeImage = dwBmBitsSize;

}

// 计算文件大小:DIB大小+BITMAPFILEHEADER结构大小

bmfHdrbfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);

// 两个保留字

bmfHdrbfReserved1 = 0;

bmfHdrbfReserved2 = 0;

// 计算偏移量bfOffBits,它的大小为Bitmap文件头大小+DIB头大小+颜色表大小

bmfHdrbfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize

+ PaletteSize((LPSTR)lpBI);

/////////////////////////////////////////////////////////////////////////

// 尝试写文件////////////////////////////////////////////////////////////

TRY

{

fileWrite((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER)); // 写文件头

fileWriteHuge(lpBI, dwDIBSize); // 写DIB头和象素

}

CATCH (CFileException, e)

{

::GlobalUnlock((HGLOBAL) hDib);

THROW_LAST();

}

END_CATCH

::GlobalUnlock((HGLOBAL) hDib);

return TRUE;

}

/

函数名称:

ReadDIBFile()

参数:

CFile& file - 要读取得文件文件CFile

返回值:

HDIB - 成功返回DIB的句柄,否则返回NULL。

说明:

该函数将指定的文件中的DIB对象读到指定的内存区域中。除BITMAPFILEHEADER

外的内容都将被读入内存。

/

HDIB CDibImage::ReadDIBFile(CFile& file)

{

BITMAPFILEHEADER bmfHeader;

HDIB hDIB;

LPSTR pDIB;

DWORD dwBitsSize;

dwBitsSize = fileGetLength(); // 获取DIB(文件)长度(字节)

// 尝试读取DIB文件头

if (fileRead((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))

{

return NULL;

}

// 判断是否是DIB对象,检查头两个字节是否是"BM"

if (bmfHeaderbfType != DIB_HEADER_MARKER)

{

return NULL;

}

// 为DIB分配内存

hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);

if (hDIB == 0)

{

return NULL;

}

pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

if (fileReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=

dwBitsSize - sizeof(BITMAPFILEHEADER) ) // 读象素

{

::GlobalUnlock((HGLOBAL) hDIB);

::GlobalFree((HGLOBAL) hDIB);

return NULL;

}

::GlobalUnlock((HGLOBAL) hDIB);

return hDIB;

}

以上就是关于求matlab工具箱内的细化函数,二值图像细化全部的内容,包括:求matlab工具箱内的细化函数,二值图像细化、MATLAB--数字图像处理 频域图像分析、图像处理的算法有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10218163.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存