网站的认识,西安企业排名,网站源码 预览,自己做的网站如何上传网上图像锐化1
实验要求
5.1实验目的、要求 实验目的#xff1a; #xff08;1#xff09;掌握图像增强的原理与相关方法。 #xff08;2#xff09;能使用VC实现图像增强的一些相关功能。 实验要求#xff1a; A部分#xff1a; #xff08;1#xff09;对一幅256级灰度…图像锐化1
实验要求
5.1实验目的、要求 实验目的 1掌握图像增强的原理与相关方法。 2能使用VC实现图像增强的一些相关功能。 实验要求 A部分 1对一幅256级灰度图像使用VC实现分段线性变换直方图均衡化。 2对一幅256级灰度图像使用VC实现锐化处理使用拉普拉斯算子。
一、 分段线性变换
1. 分段线性变换的原理
灰度图像分段线性变换是一种调整图像灰度级别的方法它通过将灰度范围划分为多个分段然后对每个分段应用线性变换来调整图像的对比度和亮度。这种方法的主要目的是增强或减弱图像中特定灰度范围的细节以改善图像的视觉效果。
下面是该方法的基本原理 分段划分 将整个灰度范围划分为多个不重叠的分段。每个分段代表图像中的一个灰度范围。这些分段由一个或多个分界点定义这些分界点将整个灰度范围划分成不同的区域。 线性变换 对每个分段应用线性变换。线性变换由斜率和截距两个参数定义。斜率决定了线的倾斜程度而截距则控制了线的位置。通过调整这两个参数可以实现对分段内灰度级别的调整。 像素更新 对图像的每个像素应用上述的分段线性变换。首先确定像素所属的分段然后使用该分段对应的线性变换来更新像素的灰度值。这样每个像素都会根据其原始灰度值和所属分段的线性变换进行调整。
通过灰度图像分段线性变换可以实现对图像不同灰度范围的灰度级别进行差异化的调整。例如可以增强图像中的低对比度区域或减弱过曝区域从而更好地展现图像细节。这种方法在图像增强和调整方面具有一定的灵活性但需要根据具体的应用场景和图像特性来选择适当的分段和线性变换参数。
2. 分段线性变换的实验代码
3. 分段线性变换的实验现象 左原灰度图 右灰度图像分段线性变换后
二、直方图均衡化
1. 直方图均衡化的原理
直方图均衡化是一种用于增强图像对比度的图像处理技术。其基本原理是将图像的灰度直方图变换成一个均匀分布的直方图从而拉伸图像的灰度范围使得亮度水平更加均匀细节更为突出。
具体的步骤如下 计算直方图 统计图像中每个灰度级别的像素数量形成直方图。 计算累积分布函数CDF 将直方图进行归一化得到每个灰度级别对应的累积概率。 C D F ( i ) ∑ j 0 i P ( j ) CDF(i) \sum_{j0}^{i} P(j) CDF(i)j0∑iP(j) 其中 P ( j ) P(j) P(j) 是灰度级别 j j j 的概率。 直方图均衡化变换函数 将CDF的值映射到新的灰度级别范围。 H ( i ) round ( C D F ( i ) × ( L − 1 ) N ) H(i) \text{round}\left(\frac{CDF(i) \times (L-1)}{N}\right) H(i)round(NCDF(i)×(L−1)) 其中 H ( i ) H(i) H(i) 是新的灰度级别 L L L 是灰度级别的最大值 N N N 是图像的总像素数量。 r o u n d ( ) round() round() 是一个数学函数通常用于将一个浮点数四舍五入为最接近的整数 应用变换 将变换函数应用于图像的每个像素更新图像的灰度级别。
通过直方图均衡化原始图像中灰度分布不均匀的区域会被映射到更广泛的灰度范围从而提高了图像的对比度使细节更加清晰。
2. 直方图均衡化的实验代码 BOOL HistogramEqualize(CDib* pDib){// 指向源图像的指针unsigned char* lpSrc;// 临时变量int nTemp;// 循环变量int i,j;// 累积直方图即灰度映射表BYTE byMap[256];// 直方图int nCount[256];// 图象的高度和宽度CSize sizeImage;sizeImage pDib-GetDimensions();// 获得图象数据存储的高度和宽度CSize SizeSaveImage;SizeSaveImage pDib-GetDibSaveDim();// 重置计数为0for (i 0; i 256; i ){// 清零nCount[i] 0;}// 计算各个灰度值的计数即得到直方图for (i 0; i sizeImage.cy; i ){for (j 0; j sizeImage.cx; j ){lpSrc (unsigned char *)pDib-m_lpImage SizeSaveImage.cx * i j;//表示从图像数据的起始位置开始跳过 i 行再移动 j 列最终指向了图像中第 i 行、第 j 列的像素的位置,获取图像中第 i 行、第 j 列的像素的灰度值// 计数加1nCount[*(lpSrc)];//以灰度值的大小为下坐标进行计数}}// 计算累积直方图for (i 0; i 256; i){// 初始为0nTemp 0;for (j 0; j i ; j){nTemp nCount[j];}// 计算对应的新灰度值---公式byMap[i] (BYTE) (nTemp * 255 / sizeImage.cy / sizeImage.cx);}// 每行for(i 0; i sizeImage.cy; i){// 每列for(j 0; j sizeImage.cx; j){// 指向DIB第i行第j个象素的指针lpSrc (unsigned char*)pDib-m_lpImage pDib-GetPixelOffset(i,j);// 计算新的灰度值x*lpSrc byMap[*lpSrc];//找到当前像素的原始灰度值并将其映射为新的灰度值。}}// 返回return TRUE;}3. 直方图均衡化的实验现象
左原图 右直方图均衡化增强后
三、 拉普拉斯算子实现锐化
拉普拉斯算子的原理
拉普拉斯算子Laplacian operator是一种用于图像处理的滤波器主要用于检测图像中的边缘和细节。它通过计算图像中每个像素点的二阶导数来实现。
拉普拉斯算子的一维形式为 L ( x ) d 2 d x 2 L(x) \frac{d^2}{dx^2} L(x)dx2d2
而在二维图像上的应用是通过以下离散形式的卷积核 [ 0 1 0 1 − 4 1 0 1 0 ] \begin{bmatrix} 0 1 0 \\ 1 -4 1 \\ 0 1 0 \\ \end{bmatrix} 0101−41010
应用拉普拉斯算子的过程是将这个卷积核与图像进行卷积运算。具体而言对于图像中的每个像素将其与卷积核中的对应元素相乘然后将所有相乘的结果相加。这个过程可以用以下的数学表达式表示 L ( x , y ) ∑ i − 1 1 ∑ j − 1 1 kernel ( i , j ) × image ( x i , y j ) L(x, y) \sum_{i-1}^{1} \sum_{j-1}^{1} \text{kernel}(i, j) \times \text{image}(x i, y j) L(x,y)i−1∑1j−1∑1kernel(i,j)×image(xi,yj)
其中 kernel ( i , j ) \text{kernel}(i, j) kernel(i,j) 是卷积核中的元素 image ( x i , y j ) \text{image}(x i, y j) image(xi,yj) 是图像中对应位置的像素值。
拉普拉斯算子对图像进行了高通滤波强调了图像中的高频细节和边缘。应用拉普拉斯算子后边缘部分的像素值将发生变化使得图像中的边缘更加明显。然而拉普拉斯算子也会增加图像中的噪声。因此在实际应用中通常会结合其他技术如平滑低通滤波来减少噪声的影响。
拉普拉斯算子的实验代码 /*************************************************************************** \函数名称* LinearSharpen()** \输入参数:* LPBYTE lpImage - 指向图象数据得指针* int nWidth - 图象数据宽度* int nHeight - 图象数据高度** \返回值:* 无** \说明:* 线性锐化图象增强* 本函数采用拉普拉斯算子对图象进行线性锐化* 在原来图象上加上拉普拉斯算子锐化的信息***************************************************************************/
void LinearSharpen (LPBYTE lpImage, int nWidth, int nHeight)
{// 遍历图象的纵坐标int y;// 遍历图象的横坐标int x;double * pdGrad ;pdGrad new double[nWidth*nHeight];//用于存储图像的梯度信息。// 初始化为0memset(pdGrad, 0, nWidth*nHeight*sizeof(double)) ;// 设置模板系数--设置拉普拉斯算子的卷积核这是一个 3x3 的矩阵用于计算图像中每个像素点的梯度。static int nWeight[3][3] ;nWeight[0][0] -1 ; nWeight[0][1] -1 ; nWeight[0][2] -1 ; nWeight[1][0] -1 ; nWeight[1][1] 8 ; nWeight[1][2] -1 ; nWeight[2][0] -1 ; nWeight[2][1] -1 ; nWeight[2][2] -1 ; //这个变量用来表示Laplacian算子象素值int nTmp[3][3];// 临时变量double dGrad;// 模板循环控制变量int yy ;int xx ;for(y1; ynHeight-1 ; y )for(x1 ; xnWidth-1 ; x ){dGrad 0 ; // Laplacian算子需要的各点象素值// 模板第一行nTmp[0][0] lpImage[(y-1)*nWidth x - 1 ] ; nTmp[0][1] lpImage[(y-1)*nWidth x ] ; nTmp[0][2] lpImage[(y-1)*nWidth x 1 ] ; // 模板第二行nTmp[1][0] lpImage[y*nWidth x - 1 ] ; nTmp[1][1] lpImage[y*nWidth x ] ; nTmp[1][2] lpImage[y*nWidth x 1 ] ; // 模板第三行nTmp[2][0] lpImage[(y1)*nWidth x - 1 ] ; nTmp[2][1] lpImage[(y1)*nWidth x ] ; nTmp[2][2] lpImage[(y1)*nWidth x 1 ] ; // 计算梯度for(yy0; yy3; yy)for(xx0; xx3; xx){dGrad nTmp[yy][xx] * nWeight[yy][xx] ;}// 梯度值写入内存*(pdGrady*nWidthx)dGrad;}//将计算得到的梯度值加到原始图像上实现锐化效果。for(y0; ynHeight ; y ){for(x0 ; xnWidth ; x ){lpImage[y*nWidthx] (unsigned char)max(0,min(255,(lpImage[y*nWidthx] (int)pdGrad[y*nWidthx]) ));}}//释放申请的内存delete []pdGrad ;pdGrad NULL ;
}拉普拉斯算子的实验现象
左原图 右经过拉普拉斯锐化