Python与FPGA——指数增强


前言

  在图像增强部分,小编挑选了部分的图像增强算法——指数增强。那就来聊聊指数增强吧。


一、指数增强介绍

  指数增强其实就是把原来图像中的像素通过以下公式映射成其他值。
q = 1 1 + ( T h r e s h o l d p ) E × 255 q = \frac{1}{1 + (\frac{Threshold}{p})^E} \times 255 q=1+(pThreshold)E1×255
  使用以下代码画出指数对比度增强曲线。

import matplotlib.pyplot as plt
import numpy as np
THRESHOLD = 127#阈值
E1 = 2
E2 = 4
E3 = 6
x = np.arange(1, 256)#从0开始涉及到除0,所以从1开始
y1 = (1 / (1 + (THRESHOLD / x) ** E1) ) * 255
y2 = (1 / (1 + (THRESHOLD / x) ** E2) ) * 255
y3 = (1 / (1 + (THRESHOLD / x) ** E3) ) * 255
plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)
plt.title("exp curve")
plt.legend(["E1", "E2", "E3"])

在这里插入图片描述
  可以从指数增强曲线中发现,小于阈值127的像素被映射的值都要比原来的像素值小,比阈值127大的都被映射成比原值要大。小的更小,大的更大,更好区分。所以下面的Python实现的图像,原图和指数增强的图像还是有明显的差别,在指数增强图像中,原来很黑的像素更黑,原来很白的像素更白。

二、Python代码实现

import matplotlib.pyplot as plt
import numpy as np
img = plt.imread("lenna.png")#读取图像
gray = 0.299 * img[:, :, 0] + 0.587 * img[:, :, 1] + 0.114 * img[:, :, 2] #灰度转化
gray = 255 * gray#[0-1]-->[0-255]
h, w, _ = img.shape#获取图像的高和宽
THRESHOLD = 127#阈值
E = 5#
img1 = np.zeros((h, w))#新图像
for i in range(h):
    for j in range(w):
        img1[i, j] = (1 / (1 + (THRESHOLD / gray[i, j]) ** E)) * 255 #增强像素
img1 = img1.astype(np.uint8)
plt.figure(figsize=(6, 6))
plt.subplot(121)
plt.title("raw image")
plt.imshow(gray, cmap='gray')
plt.subplot(122)
plt.title("exp image")
plt.imshow(img1, cmap='gray')

增强前和增强后对比图。

在这里插入图片描述

三、FPGA代码实现

//Y = (77r + 150g + 29b) >> 8
//Cb = (-43r - 85g + 128b)>>8 + 128
//Cr = (128r - 107g - 21b)>>8 + 128
module exp_enchancement(
    input	wire			vga_clk		,
    input	wire			sys_rst_n	,
    input	wire	[7:0]	r			,
    input	wire	[7:0]	g			,
    input	wire	[7:0]	b			,
	
    output	reg		[7:0]	y			,
    output	reg		[15:0]	exp_data
);
parameter THRESHOLD = 127,
          E         = 5;
reg [7: 0] y_temp;
//y分量
always @(posedge vga_clk or negedge sys_rst_n)
	if(!sys_rst_n)
		y  <=  8'd0  ;
	else
		y  <=  (77 * r + 150 * g + 29 * b) >> 8  ;//灰度图
always @(posedge vga_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin
        y_temp <= 8'd0;
    end 
    else 
        y_temp <= (1 / (1 + (THRESHOLD / y) ** E)) * 255;//指数增强
end
always @(posedge vga_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)
        exp_data <= 16'd0;
    else 
        exp_data <= {y_temp[7: 3], y_temp[7: 2], y_temp[7: 3]};
end 
endmodule

  用FPGA进行指数增强后的图像与Python增强的图像差别非常大,这是为什么呢?主要是在verilog里面“/”只能取整数。(1 / (1 + (THRESHOLD / y) ** E)) * 255代码得到的结果要么是0,要么是255。在《基于MATLAB与FPGA的图像处理教程》中作者使用的是MATLAB将图像映射后,通过查找表的形式显示,由于小编想基于自己的项目进行编写,所以没有采取书中的方式。FPGA中实现的方式存在问题,也希望广大读者大大在评论区提出解决方案,最好是基于以上代码。

在这里插入图片描述

  注:代码中exp_data输出,有三个时钟的延迟,在VGA控制显示部分要注意时序对齐。


总结

  在图像增强FPGA代码部分使用了指数增强,但是效果不尽人意,也希望读者们踊跃补充。

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值