2019-08-07 10:35:08 baidu_34971492 阅读数 147

基于FPGA的灰度图像处理之幂律(伽马)变化

1 背景知识

幂律变换的基本形式为:
(1)
其中c和为正常数。有时考虑到偏移量 可将式(1)写为。偏移量一般是显示标定问题,作为一个结果,通常在式(1)中忽略不计。对于不同的值,s与r的关系如图1所示。

在这里插入图片描述

图1 变换曲线

与对数变换的情况类似,部分值的幂律曲线将较窄范围的暗色输入值映射为较宽范围的输出值,相反的,对于输入高灰度级值时也成立。然而与对数函数不同的是,随着值的变化,将简单地得到一簇可能的变化曲线。如图1所示,>1的值所生成的曲线和<1的值所生成的曲线的效果完全相反。当c==1时简化成了恒等变换。
用于图像获取,打印和显示的各种设备根据幂律来产生响应。习惯上,幂律方程中的指数称为伽马。用于校正这些幂律响应现象的处理称为伽马校正。

在这里插入图片描述

图2 航拍图幂律变换

如图2所示,a航拍原图b~d令c=1且分别等于3.0,4.0和5.0时应用式(1)给出的变换的结果(此例的原图像由NASA提供)。

2 FPGA实现

在这里插入图片描述
图3 FPGA实现幂律变换框架图
由图2可知对于灰度图像直接经过幂律变换就可以得到幂律变换图像,但是对于FPGA直接实现对数公式显然难度很大。在FPGA中我们采用基于查找表的方式进行幂律变换。
ROM表的制作:
Matlab源码:

clear all
close all
clc
depth = 256;
width =8;
r = [0:1:255];
x = r;        %恒等变换
y =16*sqrt(r);%开根
%z = round(y);
m = (1/256)*r.^2;     %r平方
z = round(m);
fid = fopen('E:\matlab_project\log\square.mif','w');%路径 
fprintf(fid,'depth= %d; \n',depth); 
fprintf(fid,'width= %d; \n',width); 
fprintf(fid,'address_radix=uns;\n'); 
fprintf(fid,'data_radix = uns;\n'); 
fprintf(fid,'Content Begin \n'); 
for(k=1:depth)  
  fprintf(fid,'%d: %d; \n',k-1,z(k)); 
end
fprintf(fid,'end;');
hold on
plot(x);
plot(y);
plot(m);
hold off

FPGA源码:

//------------------------------------------
// power law
//------------------------------------------	
wire [7:0]	 sqrt_data; //root
wire [7:0]	 square_data;//square 			
rom_sqrt rom_sqrt_inst(
	     .address(o_y_8b),
		  .clken(TFT_de),
	     .clock(TFT_clk),
	     .q(sqrt_data)
		  );

rom_square rom_square_inst(
	     .address(o_y_8b),
		  .clken(TFT_de),
	     .clock(TFT_clk),
	     .q(square_data)
		  );

//assign TFT_rgb = {sqrt_data[7:3],sqrt_data[7:2],sqrt_data[7:3]};     //Y
assign TFT_rgb = {square_data[7:3],square_data[7:2],square_data[7:3]};     //Y
//assign TFT_rgb = {o_y_8b[7:3],o_y_8b[7:2],o_y_8b[7:3]};     //Y

IP设置:

实验结果:

在这里插入图片描述

图7 原图

在这里插入图片描述

图8原图灰度显示

在这里插入图片描述

图9整体变暗

在这里插入图片描述

图10整体变亮

结果分析:
图9、图10和图8相比,图9明显变暗,图10明显变亮。此技术可以应用在图像采集系统上。当拍摄的光线较暗时,我们可以采取亮变换;当光线过强时,我们可以采取暗变化。从而达到人眼更适合的效果。
欢迎关注微信公众号:FPGA开源工作室
获取更多学习资料。
FPGA开源工作室

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

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

若要获取更多数字图像处理,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时应用公式变换的结果
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

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

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

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

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

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

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

   代码如下:

 

2019-11-14 20:11:58 qq_41398808 阅读数 124

幂律变换的基本形式为:s=cr^{\gamma },其中c\gamma是常数

有时考虑到偏移量,上式也写为s=c(r+\varepsilon )^{\gamma }。然而,偏移量是一般显示标定问题,因而作为一个结果,通常在上式中忽略不计。

与对数变换情况类似,部分\gamma值得幂律曲线将较窄范围的暗色值,映射位较宽的目标输出值,相反,对于输入高灰度级值时也成立。

\gamma>1的值所生成的曲线和\gamma<1所生成的曲线的效果完全相反,当c=\gamma=1时简化为了恒等变换。

下面使用Python实现幂律变换:

使用的图片数据为:

 导入要使用的第三方库:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

 读取图片数据,并可视化:

img = Image.open('小亮点.jpg')
plt.axis('off')
plt.imshow(img)
plt.show()

 图像数据转换为numpy数组:

img_data = np.array(img)

 定义幂律变换函数:

def power_law_rollovers(img, func, c, b):
    img_data = np.array(img)
    a = np.shape(img_data)
    new_img = []
    for i in range(a[0]):
        new_row = []
        for j in range(a[1]):
            data = list(img_data[i][j])
            new_data = func(data, c, b)
            new_row.append(np.array(new_data))
        new_img.append(np.array(new_row))
    return new_img
def power_law(data, c, b):
    new_data = []
    for k in data:
        a = int(c*(k**b))
        new_data.append(a)
    return new_data

 结果:

共生成4张图片,参数c=1,参数\gamma分别等于0.8,0.6,0.4,0.3

new_img1 = power_law_rollovers(img, power_law, 1, 0.8)
new_img2 = power_law_rollovers(img, power_law, 1, 0.6)
new_img3 = power_law_rollovers(img, power_law, 1, 0.4)
new_img4 = power_law_rollovers(img, power_law, 1, 0.3)

new_img1 = np.array(new_img1)
new_img2 = np.array(new_img2)
new_img3 = np.array(new_img3)
new_img4 = np.array(new_img4)

new_img1 = Image.fromarray(new_img1.astype('uint8')).convert('RGB')
new_img2 = Image.fromarray(new_img2.astype('uint8')).convert('RGB')
new_img3 = Image.fromarray(new_img3.astype('uint8')).convert('RGB')
new_img4 = Image.fromarray(new_img4.astype('uint8')).convert('RGB')

plt.figure(figsize=(25,60))
plt.subplot(221)
plt.axis('off')
gray1 = new_img1.convert('L')
plt.imshow(gray1, cmap='gray')
plt.subplot(222)
plt.axis('off')
gray2 = new_img2.convert('L')
plt.imshow(gray2, cmap='gray')
plt.subplot(223)
plt.axis('off')
gray3 = new_img3.convert('L')
plt.imshow(gray3, cmap='gray')
plt.subplot(224)
plt.axis('off')
gray4 = new_img4.convert('L')
plt.imshow(gray4, cmap='gray')
plt.show()

 

 

2019-04-23 21:57:02 jameschen9051 阅读数 293

        幂律(伽马)变换公式:s = cr^\gamma,γ取值范围(0,+∞)

        对图像做幂律变换处理,当γ取值(0,1)可以将图像较暗的灰度值映射到更大的灰度值,同时较亮部分变化较小;γ取值(1,+∞)可以将较亮部分映射到更低的亮度,而更暗的部分变化较小。

        处理彩色图像,只需要将RGB取出,分别进行幂律变换即可。公式中,c可以取值255,r = a/255,a为像素上RGB分量之一,那么整个公式的取值范围为(0,255),不考虑计算过程的四舍五入的话,幂律变换的操作是可逆的。

实现代码如下:

public void gammaTranverse(BufferedImage image, double param) {
		for (int i = 0; i < image.getWidth(); i++) {
			for (int j = 0; j < image.getHeight(); j++) {

				// 将rgb转换为各个值
				int rgb = image.getRGB(i, j);
				double R = (rgb >> 16) & 0xff;
				double G = (rgb >> 8) & 0xff;
				double B = rgb & 0xff;

				// 进行伽马变换
				R = 255 * Math.pow(R / 255, param);
				G = 255 * Math.pow(G / 255, param);
				B = 255 * Math.pow(B / 255, param);
				// 将值转换为rgb
				rgb = ((clamp(255) & 0xff) << 24) | ((clamp((int) R) & 0xff) << 16) | ((clamp((int) G) & 0xff) << 8)
						| ((clamp((int) B) & 0xff));
				image.setRGB(i, j, rgb);
			}
		}
	}

测试结果:

1、原图。这是一张光线暗到几乎很难直接看到地面物体的航拍影像。通过幂律变换进行处理,增强较暗影像。

2、γ取值为0.4,通过幂律变换处理后效果,可以看到影像增强效果非常明显,影像大部分区域由几乎不可见变得可见。

3、这是一幅光线比较强,且受到云雾干扰的影像。

4、γ取值为2处理后效果,影像整体变暗,但对比度更明显,受光线和云雾干扰造成的泛白现象减弱,整体视觉效果有所提升。

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