2010-05-23 14:49:00 yangfenghero 阅读数 3461

   幂次变换的基本表达式为:y=cxr+b

    其中cr均为正数。与对数变换相同,幂次变换将部分灰度区域映射到更宽的区域中。当r=1时,幂次变换转变为线性变换。

   (1)  当r<0时,变换函数曲线在正比函数上方。此时扩展低灰度级,压缩高灰度级,使图像变亮。这一点与对数变换十分相似。

   (2)  当r>0时,变换函数曲线在正比函数下方。此时扩展高灰度级,压缩低灰度级,使图像变暗。

   代码如下:

 

2019-11-25 09:39:25 qq_24965393 阅读数 51

空间域图像变换:图像反转,对数变换,幂次变换、分段线性变换 (s:现点值,r: 原点值)

(一)图像反转:

这个无需多说,就是把黑变白,白变黑,拿八位灰度图像来说
表达式:s=255-r
作用:看清暗色图像中白色和灰色的细节。

例如: 我们对某位患者的胸片进行处理,原图中有白色絮状物体,但是图片整体偏暗,不便于观察,于是我们进行线性的反转,将较亮部位与较暗部位进行互换,如下图所示,肉眼可见观察的更加清晰了。
在这里插入图片描述

(二)对数变换:

此变换使一窄带低灰度输入图像值映射为一宽带输出值。相对的是输入灰度的高调整值。可以利用这种变换来扩展被压缩的高值图像中的暗像素。相对的是反对数变换的调整值。(这段转自《数字图像处理》(第二版)(冈萨雷斯))

表达式:s=c log(1+r)
在这里插入图片描述应用:用于对数值范围过大的数据进行调整显示,如傅立叶变换后的图像数据(0-1.5e6),同时低灰度值拉伸
在这里插入图片描述根据对数函数的特征,会将输入图像的灰度值中较暗部分 r < L/4 部分映射到 [0 3L/4]这个较大的范围,而较亮部分则会映射到较小的区域。这个函数会将图像暗处的细节放大,压缩亮处的细节。最具代表的就是对傅里叶频谱的对数运算,从对比图中可以看到暗处的细节被放大输出
在这里插入图片描述

(三)幂次变换:

又叫伽玛校正,和对数变换的原理差不多,不多说了,只是参数多了一个,可变宽带的输入像素值范围可选了,把低值带拉伸还是把高值拉伸要看伽马的设定了。

表达式:在这里插入图片描述伽马变换
在这里插入图片描述在这里插入图片描述
一个是伽马等于4,一个是伽马等于0.2;一个拉伸高像素值的范围,一个拉伸低像素值的范围。哪部分的斜率越大,哪部分的拉伸比例就越大。
在这里插入图片描述
当gamma>1时,效果和对数函数相似,放大暗处细节,压缩亮处细节,随着数值减少,效果越强

当gamma<1时,放大亮处细节,压缩暗处细节,随着数值增大,效果越强

(四)分段线性变换:

分为:对比拉伸、灰度切割、位图切割
在这里插入图片描述在这里插入图片描述位图切割就是比如8位的图像,我把像素点的每一位拿出来做个位平面,然后就有8个位平面了。
以上这几种常用的处理方法都是将固定范围内的像素值的显示范围放大或缩小,让图像更符合人的要求。

由于灰度级在这里插入图片描述,是有2的次方构成,每个像素值看作是由K个二进制数组成的
在这里插入图片描述
于是每个平面k-1,k-2,…,1,0 中的每一个像素值都等于该像素在该平面的项数值
在这里插入图片描述在这里插入图片描述

(五)直方图均衡与匹配:

在这里插入图片描述表示像素值在这里插入图片描述在图像中出现的次数在这里插入图片描述,下图显示的是图片对应的直方图

在这里插入图片描述
直方图均衡

归一化直方图:在这里插入图片描述表示像素值在这里插入图片描述,在图像中出现的概率在这里插入图片描述

可以将函数变换到直方图较均衡分布的状态
在这里插入图片描述
直方图变换的在这里插入图片描述函数,通过归一化直方图相加获得,在matlab 中使用histeq(f,256)直接获得均衡后的图像
在这里插入图片描述
直方图匹配

直方图匹配是在均衡的基础上进行,希望最后处理后的图像符合某种特定的直方图分布。为什么要这样呢,主要是因为均衡是将整个图像整体的均衡,可能将整体的图片变化的太暗或是太亮,如图,左边为原图,中间为直方图均衡,右边为直方图匹配。
在这里插入图片描述
通过下图直方图均衡的变化函数在这里插入图片描述,也能看出,均衡将函数值变得偏大,图像便整体偏大
在这里插入图片描述
再分析图像变化前后的直方图分布,我们可以发现,原图的像素值主要分布在较暗和较亮两个极端位置,但是直方图均衡就粗暴的将大家都平均了。
在这里插入图片描述
假设我们希望最后图像归一化直方图为在这里插入图片描述,求相应的变换函数,在这里插入图片描述

而输入图像的变换函数为在这里插入图片描述,我们希望他们相等即在这里插入图片描述,便可求出S到Z的映射。

2019-04-02 22:43:48 weixin_43227685 阅读数 799

图像的幂次变换

  • 幂次变换的基本表达式为:y=cx^r+b
    其中c、r均为正数。与对数变换相同,幂次变换将部分灰度区域映射到更宽的区域中。当r=1时,幂次变换转变为线性变换。

    (1) 当r<1时,变换函数曲线在正比函数上方。此时扩展低灰度级,压缩高灰度级,使图像变亮。这一点与对数变换十分相似。

    (2) 当r>1时,变换函数曲线在正比函数下方。此时扩展高灰度级,压缩低灰度级,使图像变暗。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 代码实现时要注意原像素要先除以255.0进行归一化,幂次运算后再*255,否则会发生错误。

  • 代码如下:

#include <string.h>   
#include <math.h>     
#include <stdio.h>     
#include <stdlib.h>     
#include <malloc.h>  
  
#include<time.h>//时间相关头文件,可用其中函数计算图像处理速度  
  
#define   WIDTHBYTES(bits) (((bits)+31)/32*4)//用于使图像宽度所占字节数为4byte的倍数  
  
typedef unsigned char  BYTE;  
typedef unsigned short WORD;  
typedef unsigned long  DWORD;  
typedef long LONG;  
  
//位图文件头信息结构定义  
//其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息)  
  
typedef struct tagBITMAPFILEHEADER {  
DWORD  bfSize;          //文件大小  
WORD   bfReserved1;     //保留字,不考虑  
WORD   bfReserved2;     //保留字,同上  
DWORD  bfOffBits;       //实际位图数据的偏移字节数,即前三个部分长度之和  
} BITMAPFILEHEADER;   
  
//信息头BITMAPINFOHEADER,也是一个结构,其定义如下:  
  
typedef struct tagBITMAPINFOHEADER{  
//public:  
DWORD   biSize;             //指定此结构体的长度,为40  
LONG    biWidth;            //位图宽  
LONG    biHeight;           //位图高  
WORD    biPlanes;           //平面数,为1  
WORD    biBitCount;         //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32  
DWORD   biCompression;      //压缩方式,可以是0,1,2,其中0表示不压缩  
DWORD   biSizeImage;        //实际位图数据占用的字节数  
LONG    biXPelsPerMeter;    //X方向分辨率  
LONG    biYPelsPerMeter;    //Y方向分辨率  
DWORD   biClrUsed;          //使用的颜色数,如果为0,则表示默认值(2^颜色位数)  
DWORD   biClrImportant;     //重要颜色数,如果为0,则表示所有颜色都是重要的  
} BITMAPINFOHEADER;   
 
void main()
{
	long now=0;
	now=clock();//存储图像处理开始时间
 
	BITMAPFILEHEADER bitHead;
	BITMAPINFOHEADER bitInfoHead; 
	FILE* pfile;
	FILE* wfile;
 
	char strFile[50]="C:\\testpicture\\6.bmp";//打开图像路径,需修改为自己图像存储的路径
	char strFilesave[50]="C:\\testpicture\\8.bmp";//处理后图像存储路径,需修改为自己图像存储的路径
	pfile = fopen(strFile,"rb");//文件打开图像
	wfile = fopen(strFilesave,"wb");//打开文件为存储修改后图像做准备
 
	//读取位图文件头信息
	WORD fileType;
	fread(&fileType,1,sizeof(WORD),pfile);
	fwrite(&fileType,1,sizeof(WORD),wfile);
	if(fileType != 0x4d42)
	{
		printf("file is not .bmp file!");
		return;
	}
	fread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),pfile);
	fwrite(&bitHead,1,sizeof(tagBITMAPFILEHEADER),wfile);//写回位图文件头信息到输出文件  
 
	//读取位图信息头信息
	fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile);
	fwrite(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),wfile);//写回位图信息头信息到输出文件  
 
	int width = bitInfoHead.biWidth;
	int height = bitInfoHead.biHeight;
	//分配内存空间把源图存入内存   
	int l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);//计算位图的实际宽度并确保它为4byte的倍数 
 
	BYTE    *pColorData=(BYTE *)malloc(height*l_width);//开辟内存空间存储图像数据
	memset(pColorData,0,height*l_width);   
 
	BYTE    *pColorDataMid=(BYTE *)malloc(height*l_width);//开辟内存空间存储图像处理之后数据
	memset(pColorDataMid,0,height*l_width); 
 
	long nData = height*l_width;
 
	//把位图数据信息读到数组里   
	fread(pColorData,1,nData,pfile);//图像处理可通过操作这部分数据加以实现,可将下面的示例修改为中值滤波等各种图像处理模块
									//在嵌入式开发环境下,大多数情况下已经得到图像数据区,是故将下面部分代码稍作修改就可以移植到嵌入式端
 
	/*******************图像处理部分******************/
		/*******************示例,将图像亮度减半******************/
		for(int hnum=0;hnum<height;hnum++)
			for(int wnum=0;wnum<width;wnum++)
			{
				int pixel_point=hnum*l_width+wnum*3;//数组位置偏移量,对应于图像的各像素点RGB的起点  
				pColorDataMid[pixel_point]=pow(pColorData[pixel_point]/ 255.0, 3) * 255;
				pColorDataMid[pixel_point+1]=pow(pColorData[pixel_point+1]/ 255.0, 3) * 255;
				pColorDataMid[pixel_point+2]=pow(pColorData[pixel_point+2]/ 255.0, 3) * 255;
			}
		/*******************示例,将图像亮度减半******************/
	/*******************亮度控制******************/
 
	fwrite(pColorDataMid,1,nData,wfile);//将处理完图像数据写回文件
	fclose(pfile);
	fclose(wfile);
 
	printf("图像处理完成\n");
	printf("运行时间为:%dms\n",clock()-now);//输出图像处理花费时间信息
}

运行效果:

在这里插入图片描述
原图
在这里插入图片描述
C=1,γ=0.3
在这里插入图片描述
C=1,γ=0.4
在这里插入图片描述
C=1,γ=0.6
在这里插入图片描述
C=1,γ=3
在这里插入图片描述
C=1,γ=4
在这里插入图片描述
C=1,γ=5

2019-02-03 14:54:15 qq_42505705 阅读数 1450

本文主要介绍对《数字图像处理》第三章书中示例图片实现 反转变换对数变换以及伽马变换的代码

若要获取更多数字图像处理,python,深度学习,机器学习,计算机视觉等高清PDF以及 更多有意思的 分享,可搜一搜 微信公共号 “分享猿” 免费获取资源。也可扫描下面的二维码关注,期待你的到来~
在这里插入图片描述
图像增强的三类基本函数:线性函数(反转和恒等变换)、对数函数(对数和反对数变换)、幂律函数(n次幂和n次跟变换)

一、反转变换

公式S=L-1-r
在这里插入图片描述
代码实现

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\xxx\Desktop\breast.tif',0)

reverse_img = 255 - img

cv2.imshow('srcimg',img)
cv2.imshow('reverse_img',reverse_img)
cv2.waitKey(0)

下列分别是乳房X射线原始图及用上式给出的反转图像
在这里插入图片描述 在这里插入图片描述
二、对数变换

公式s=clog(1+r)
下图是当c=1时的r与s关系图
在这里插入图片描述
代码实现

import cv2
import math
import numpy as np

def logTransform(c,img):

    #3通道RGB
    '''h,w,d = img.shape[0],img.shape[1],img.shape[2]
    new_img = np.zeros((h,w,d))
    for i in range(h):
        for j in range(w):
            for k in range(d):
                new_img[i,j,k] = c*(math.log(1.0+img[i,j,k]))'''

    #灰度图专属
    h,w = img.shape[0], img.shape[1]
    new_img = np.zeros((h, w))
    for i in range(h):
        for j in range(w):
            new_img[i, j] = c * (math.log(1.0 + img[i, j]))


    new_img = cv2.normalize(new_img,new_img,0,255,cv2.NORM_MINMAX)

    return new_img
    
#替换为你的图片路径
img = cv2.imread(r'C:\Users\xxx\Desktop\Fourier spectrum.tif',0)

log_img = logTransform(1.0,img)
cv2.imshow('log_img',log_img)
cv2.imwrite(r'C:\Users\xxx\Desktop\Fourier spectrum2.jpg',log_img)
cv2.waitKey(0)

备注:当r=255时,s=5.541

下列图像分别是傅里叶频谱和应用上式中的对数变换(c=1)的结果
在这里插入图片描述 在这里插入图片描述
由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升。可用于增强图像的暗部细节

三、幂律(伽马)变化

公式:s=cr^γ
其中c、γ 为常数。考虑偏移量上式可写为 s=c(ε+r)^γ
对于不同的 γ 值,s 与 r的关系曲线如下图所示
在这里插入图片描述
伽马变换可以很好地拉伸图像的对比度,扩展灰度级。
由图可知,
当图像的整体灰度偏暗时,选择γ<1,可以使图像增亮;
当图像的整体灰度偏亮时,选择γ>1,可以使图像变暗,
提高图像的对比度,凸显细节。

用于图像获取、打印和显示的各种设备根据幂律来产生响应,用于校正这些幂律响应现象的处理称为伽马校正
例如,阴极射线管(CRT)设备有一个灰度-电压响应,该响应是一个指数变化范围约为1.8~2.5的幂函数。

代码实现

import math
import numpy as np
import cv2

def gammaTranform(c,gamma,image):
    h,w,d = image.shape[0],image.shape[1],image.shape[2]
    new_img = np.zeros((h,w,d),dtype=np.float32)
    for i in range(h):
        for j in range(w):
            new_img[i,j,0] = c*math.pow(image[i, j, 0], gamma)
            new_img[i,j,1] = c*math.pow(image[i, j, 1], gamma)
            new_img[i,j,2] = c*math.pow(image[i, j, 2], gamma)
    cv2.normalize(new_img,new_img,0,255,cv2.NORM_MINMAX)
    new_img = cv2.convertScaleAbs(new_img)

    return new_img

img = cv2.imread(r'C:\Users\xxx\Desktop\gray.jpg',1)

new_img = gammaTranform(1,2.5,img)

cv2.imshow('x',new_img)
cv2.imwrite(r'C:\Users\xxx\Desktop\gray_2.5.jpg',new_img)
cv2.waitKey(0)

下图是用变换s = r^1/2.5 = r^0.4进行伽马校正的示例的结果
在这里插入图片描述
一般,随着设备的不同,伽马值也不同

使用幂律变换进行对比度增强
γ<1 增强亮度
分别是原图,以及c=1时的γ=0.6、0.4、0.3时应用上公示的结果
在这里插入图片描述

γ>1 增强暗度
航拍图像
在这里插入图片描述
下面三幅图片分别是c=1时γ等于3.0、4.0、5.0时应用公式变换的结果
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

搜索公众号“分享猿”,并回复关键词“代码”,获取本文全部代码
留言或者公众号关注我,我们一起分享数字图像处理心得,一起交流学习吧~

2014-07-11 15:34:21 mghhz816210 阅读数 20609

空间域增强的第部分:图像反转对数变换幂次变换分段线性变换


(s:现点值,r: 原点值)

图像反转:

    这个无需多说,就是把黑变白,白变黑,拿八位灰度图像来说                                

    表达式:s=255-r

    作用:看清暗色图像中白色和灰色的细节。


对数变换:

    此变换使一窄带低灰度输入图像值映射为一宽带输出值。相对的是输入灰度的高调整值。可以利用这种变换来扩展被压缩的高值图像中的暗像素。相对的是反对数变换的调整值。(这段转自《数字图像处理》(第二版)(冈萨雷斯))

                附:说的太透彻了,找不到比这更好的语言了 

      表达式:s=c log(1+r);

     变换曲线:

     应用:用于对数值范围过大的数据进行调整显示,如傅立叶变换后的图像数据(0-1.5e6).


幂次变换:

    又叫伽玛校正,和对数变换的原理差不多,不多说了,只是参数多了一个,可变宽带的输入像素值范围可选了,把低值带拉伸还是把高值拉伸要看伽马的设定了。

    表达式:伽马变换(这个是图片格式,粘的太丑,不过不影响什么)

变换曲线:

                 一个是伽马等于4,一个是伽马等于0.2;一个拉伸高像素值的范围,一个拉伸低像素值的范围。哪部分的斜率越大,哪部分的拉伸比例就越大。


分段线性变换:

分为:对比拉伸灰度切割位图切割

图:

 位图切割就是比如8位的图像,我把像素点的每一位拿出来做个位平面,然后就有8个位平面了。


以上这几个处理方法都是将固定范围内的像素值的显示范围放大或缩小,让图像更符合人为意愿。

没有更多推荐了,返回首页