Python与FPGA——局部二值化

文章目录


前言

局部二值化较全局二值化难,我们将在此实现Python与FPGA的局部二值化处理。


一、局部二值化

局部二值化就是使用一个窗口,在图像上进行扫描,每扫出9个像素求平均,再和阈值进行比较。如果9个像素的平均值大与等于阈值,就将窗口中心对应的图像像素设置为255,否则就设置为0。

二、Python局部二值化

以下虽然是局部二值化处理,但是在此基础上,增加了阈值乘以一个ratio小数,可以调整阈值,实现局部阈值二值化处理。

c 复制代码
import numpy as np
import matplotlib.pyplot as plt
img = plt.imread("lenna.png")
gray = 0.299 * img[:, :, 0] + 0.587 * img[:, :, 1] + 0.114 * img[:, :, 2] 
gray = gray * 255#图像是[0-1]--->[0-255]
def local_threshold(gray, ratio, threshold, size=3):
    h, w = gray.shape
    m = int((size - 1) / 2)
    local_image = np.zeros((h, w))
    for i in range(m, h - m):
        for j in range(m, w - m):
            value = np.floor((np.sum(gray[i - m: i + m + 1, j - m: j  + m + 1]) / (size ** 2)) * ratio)
            if(value <= threshold):
                local_image[i, j] = 0
            else:
                local_image[i, j] = 255
    return local_image.astype(np.uint8)

local_image = local_threshold(gray, 0.9, 128, 3)
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(1, 2, 1)
ax.set_title("gray image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(gray, cmap="gray")
ax = fig.add_subplot(1, 2, 2)
ax.set_title("local image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(local_image, cmap="gray")

三、FPGA局部二值化

c 复制代码
module  ycbcr2binary_local
(
	input	wire			vga_clk		,//vga时钟
	input	wire			sys_rst_n	,//复位信号
	input	wire	[7:0]	y_data		,//灰度处理的图像像素
	input	wire			rgb_valid	,//vga显示有效区域
	
	output	wire	[15:0]	binary_data	//二值化像素
);

//shift ram
wire	[7:0]	data_row1	;
wire	[7:0]	data_row2	;
wire	[7:0]	data_row3	;
//3*3像素数据
reg		[7:0]	p11			;
reg		[7:0]	p12			;
reg		[7:0]	p13			;
reg		[7:0]	p21			;
reg		[7:0]	p22			;
reg		[7:0]	p23			;
reg		[7:0]	p31			;
reg		[7:0]	p32			;
reg		[7:0]	p33			;

wire	[7:0]	temp	    ;
//Y值有效信号
reg				y_valid		;

assign  data_row3 = y_data  ;
//中值拼接565
assign  temp = (p11 + p12 + p13 + p21 + p22 + p23 + p31 + p32 + p33) / 9;//9个像素平均值
assign  binary_data = (temp >= 8'd128) ? 16'hffff: 16'h0000;//比较并设置像素
always@(posedge vga_clk or negedge sys_rst_n)	
	if(sys_rst_n == 1'b0)
		y_valid  <=  1'b0  ;
	else
		y_valid  <=  rgb_valid  ;

always@(posedge vga_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		begin
			{p11,p12,p13}  <=  24'd0  ;
			{p21,p22,p23}  <=  24'd0  ;
			{p31,p32,p33}  <=  24'd0  ;
		end
	else  if(y_valid == 1'b1)
		begin
			{p11,p12,p13}  <= {p12,p13,data_row1}  ;
			{p21,p22,p23}  <= {p22,p23,data_row2}  ;
			{p31,p32,p33}  <= {p32,p33,data_row3}  ;
		end	
	else
		begin
			{p11,p12,p13}  <=  24'd0  ;
			{p21,p22,p23}  <=  24'd0  ;
			{p31,p32,p33}  <=  24'd0  ;
		end	
//移位寄存器
shift_ram_gen  shift_ram_gen_inst
(
	.clock 		(vga_clk	),
	.shiftin	(data_row3	),
	.shiftout 	(			),
	.taps0x 	(data_row2	),
	.taps1x 	(data_row1	)
);


endmodule

在FPGA中,小编没有将阈值乘上一个小数,如果要和Python实现一致,你也可以尝试加上。


总结

图像二值化也就告一段落,二值化比较基础,下一章节聊聊sobel边缘检测。还是一样,sobel是谁不重要,重要的是要用他去完成sobel检测。敬请期待。

相关推荐
zcz160712782116 分钟前
LVS + Keepalived 高可用负载均衡集群
java·开发语言·算法
站大爷IP18 分钟前
PID控制算法原理与Python实现:从理论到实践的通俗解析
python
aopstudio24 分钟前
如何优雅地清理Hugging Face缓存到本地的模型文件(2025最新版)
人工智能·python·缓存·语言模型
Wiktok25 分钟前
[Wit]CnOCR模型训练全流程简化记录(包括排除BUG)
python·深度学习·bug
Bellafu66644 分钟前
项目中遇到pom文件里使用systemPath的例子记录
开发语言
lianghaibos1 小时前
虚拟环境下,pythonDjango项目配置pycharm运行/debugger运行
ide·python·pycharm
爱喝水的鱼丶1 小时前
SAP-MM:SAP采购组织全面学习指南:从概念到实战配置图解
运维·开发语言·数据库·学习·sap·mm模块·采购组织
楼田莉子1 小时前
Python学习——字典和文件
开发语言·python·学习·pycharm
知彼解己1 小时前
字符串大数相加:从初稿到优化的思路演进
java·开发语言·算法
好多171 小时前
《JVM如何排查OOM》
开发语言·jvm·python