Python与FPGA——局部二值化
前言
局部二值化较全局二值化难,我们将在此实现Python与FPGA的局部二值化处理。
一、局部二值化
局部二值化就是使用一个窗口,在图像上进行扫描,每扫出9个像素求平均,再和阈值进行比较。如果9个像素的平均值大与等于阈值,就将窗口中心对应的图像像素设置为255,否则就设置为0。
二、Python局部二值化
以下虽然是局部二值化处理,但是在此基础上,增加了阈值乘以一个ratio小数,可以调整阈值,实现局部阈值二值化处理。
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局部二值化
module ycbcr2binary_local
(
inputwirevga_clk,//vga时钟
inputwiresys_rst_n,//复位信号
inputwire[7:0]y_data,//灰度处理的图像像素
inputwirergb_valid,//vga显示有效区域
outputwire[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值有效信号
regy_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检测。敬请期待。
原文地址:https://blog.csdn.net/stark_cc/article/details/136458597
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!