前言
使用matlab,提取图片中的RGB分量,并设定阈值,转换成TXT文件,编写verilog程序,利用txt文件数据转换成二值化的txt数据,最后重新生成图片。
提示:以下是本篇文章正文内容,下面案例可供参考
一、matlab火焰rgb分割
clc;
clear all;
I2=imread('12.jpg');
I=double(I2); %将读入的数据转换成double类型
R=I(:,:,1); %提取红色分量
G=I(:,:,2); %提取绿色分量
B=I(:,:,3); %提取蓝色分量
[m,n,p]=size(I);
I1 = [];
% 实现图像的RGB检测,把符合RGB判据的素点置为1,否则置为0,返回的是只有0和1的二值化模板。
for i=1:m
for j=1:n
if (输入判断条件)%判断是否输入火焰RGB颜色正交特征
I1(i,j) = 1; %属于火焰特征设置像素点为白
else
I1(i,j) = 0; %不属于火焰特征设置像素点为黑
end
end
end
% I1 = (R+G+B)/3, 100<I1<150,I2 =(R-B)/2, 15<I2<120
figure
imshow(I1)
title('二值化结果')
se1 = strel('disk',2);
f1 = imclose(I1,se1);
[L,num]=bwlabel(f1);
STATS = regionprops(L,'BoundingBox');
%%
figure
imshow(I2)
hold on
rectangle('Position',STATS(1).BoundingBox,'EdgeColor','r','LineWidth',2);
title('基于RGB特征的火焰分割')
二、verilog程序
1.设计文件
使用matlab程序读取rgb的三个分量,并保存至txt文件中并编写设计文件。
2.仿真文件
代码如下(示例):
`timescale 1ns/1ps
module RGB_deteciton_tb;
reg sys_clk;
reg sys_rst_n;
reg [4:0] R_image;
reg [5:0] G_image;
reg [4:0] B_image;
reg pi_flag;
wire [1:0] b2w_seg;
wire po_flag;
reg [7:0] rgb_data_mem [413100:0];
reg [18:0] addr;
integer fid;
initial fid=$fopen("rgb_data_out.txt");
always @ (posedge sys_clk,negedge sys_rst_n)
begin
if(po_flag==1'b1)
$fdisplay(fid,"%d",b2w_seg);
end
initial sys_clk=0;
always #10 sys_clk=~sys_clk;
initial $readmemh("rgb_data.txt",rgb_data_mem);
initial begin
sys_rst_n=0;
R_image = 0;
G_image = 0;
B_image = 0;
pi_flag=0;
addr=0;
#105;
sys_rst_n=1;
repeat (137700) begin
@(posedge sys_clk);
#2;
R_image = rgb_data_mem[0 + addr];
G_image = rgb_data_mem[1 + addr];
B_image = rgb_data_mem[2 + addr];
pi_flag=1;
#5;
addr=addr+3;
end
@(posedge sys_clk);
#2;
R_image = 0;
G_image = 0;
B_image = 0;
pi_flag=0;
#200;
$fclose(fid);
$stop;
end
//inst
RGB_detection RGB_detection_inst(
. sys_clk (sys_clk),
. sys_rst_n (sys_rst_n),
. pi_flag (pi_flag),
. R_image (R_image),
. G_image (G_image),
. B_image (B_image),
. po_flag (po_flag),
. b2w_seg (b2w_seg)
);
endmodule