FPGA与Matlab图像处理之直方图均衡化

文章目录

  • 一、什么是直方图?
  • 二、什么是直方图均衡化?
  • 三、Matlab实现直方图均衡化的步骤
    • 第一步: 彩色图像转成灰度图像
    • 第二步:提取亮度通道的直方图
    • 第三步:累计亮度通道的像素值频率
    • 第四步: 映射到新的灰度值
  • 四、Verilog实现直方图均衡化
    • 第一步:Verilog实现彩色图像转灰度图像
      • 4.1.1Verilog代码
      • 4.1.2 仿真截图
    • 第二步:Verilog实现统计累计灰度直方图
      • 4.2.1 verilog代码
      • 4.2.2 仿真结果
    • 第三步:Verilog实现直方图均衡化
      • 4.3.1 Verilog代码
      • 4.3.2 仿真结果


一、什么是直方图?

  在前文《Verilog和Matlab实现RGB888互转YUV444》中我们知道,人眼对亮度的敏感度要大于色度的敏感度,图像的直方图是用来表示图像中像素亮度或颜色分布的一种图形表示方法。它通过统计图像中每个亮度值(或颜色值)出现的频率,如下图所示:

在这里插入图片描述
  X轴表示亮度的范围;对于8色深的图像,亮度范围就是0-255 ,Y轴表示每亮度下所拥有的像素数量。在图像处理中,直方图的作用有:

  • 对比度调整:通过分析直方图,可以了解图像的对比度,并进行相应的调整。
  • 图像增强:可以使用直方图均衡化等技术来改善图像的视觉效果。
  • 特征提取:在图像处理和计算机视觉中,直方图可以作为特征之一,用于图像分类、识别等任务。
  • 分析图像质量:通过观察直方图,可以识别图像是否存在过曝或欠曝等问题。

  如上面这张原始图片我们可以看出整体画面比较明亮,直方图显示各灰阶的数量都比较均衡,接下来我们看另一张图片的直方图:

在这里插入图片描述
  我们可以看到这幅图整体画面比较暗,在直方图上面体现出来就是像素数量比较集中在左侧,相反我们也可也通过观测一张图片的直方图来大致判断这副图片的整体明暗程度。

二、什么是直方图均衡化?

  直方图均衡化是一种经典的图像处理算法,用以改善图像的亮度和对比度。如果一副图片整体偏暗,灰度值大致分布在较低的范围内;图像进行直方图均衡化后会使其原本分布集中在低范围色阶的像素值,均衡的分布到所有可取值的范围,这样,图像就既有明亮也有灰暗,对比度和亮度就得到了改善,直方图均衡化的作用:

  1. 增强对比度:直方图均衡化通过重新分配图像的亮度值,使得图像的亮度范围更加均匀。这可以显著提高图像的对比度,使得细节更加清晰,特别是在原始图像对比度较低的情况下。
  2. 改善细节可见性:通过均衡化,暗部和亮部的细节会更加明显。这对于医学影像、卫星图像等需要清晰细节的应用非常重要。
  3. 去除光照不均:在某些情况下,图像可能由于光照条件不均而出现阴影或亮斑。均衡化可以帮助减轻这些问题,使得图像更加均匀。
  4. 增强特征提取:在计算机视觉和图像分析中,均衡化后的图像能更好地突出特征,使得后续的特征提取和分类任务更加有效。
  5. 提高图像质量:在某些情况下,直方图均衡化可以改善图像的整体视觉质量,使得图像在不同显示设备上表现得更加一致。

在这里插入图片描述
  上面就是将一张整体偏暗的图片均衡化后的效果。可以看出,均衡化后的图片一些细节都显示出来了,均衡化后的直方图也比较均匀,我们也可以转成灰度图片来观察:

在这里插入图片描述
  在实际实现过程中,就是要先将彩色图片转换成灰度图片后,在做均衡化处理,因为直方图均衡化只对亮度Y进行处理,对于色彩通道的Cb、Cr是不做处理的,这就是直方图均衡化的作用。

三、Matlab实现直方图均衡化的步骤

第一步: 彩色图像转成灰度图像

  上文可以知道,直方图均衡化是对亮度进行操作的,因此我们处理图像时候,先将彩色图片转换成灰度图片,使得RGB三个分量的值都变成YYY,这样操作图像的数据就只是操作了亮度Y,颜色数据我们保留,彩色转灰度图像在matlab可以直接调用:

I = rgb2gray(RGB)

整体代码如下:

% 读取彩色图像
img = imread('....\....\....\...\.....bmp');% 将彩色图像转换为灰度图像
grayImg = rgb2gray(img);% 原图像
subplot(1, 2, 1);
imshow(img);
title('原始图像');% 灰度图像
subplot(1, 2, 2);
imshow(grayImg);
title('灰度图像');

在这里插入图片描述

第二步:提取亮度通道的直方图

  统计图像亮度通道各色阶中像素的个数,为后续做均衡化做准备,在matlab中直接调用:

[counts,binLocations] = imhist(I)  %计算灰度图像 I 的直方图。imhist 函数在 counts 中返回直方图计数,在 binLocations 中返回 bin 位置。直方图中 bin 的数量由图像类型确定。

整体代码如下:

% 读取彩色图像
img = imread('...\....\.....\.....\....bmp');% 将彩色图像转换为灰度图像
grayImg = rgb2gray(img);% 计算灰度图像的直方图
[counts, grayLevels] = imhist(grayImg);% 原图像
subplot(1, 3, 1);
imshow(img);
title('原始图像');% 灰度图像
subplot(1, 3, 2);
imshow(grayImg);
title('灰度图像');% 原始直方图
subplot(1, 3, 3);
bar(grayLevels, counts);
title('原始图像的直方图');
xlim([0 255]);

在这里插入图片描述

第三步:累计亮度通道的像素值频率

  统计每一个灰度在原始图像上的像素所占总体的比例,例如一共有100个像素值,其中第26色阶有15个像素点,那么25色阶上的像素值频率 = 15/100 = 0.15 ,现在我们将每个色阶对应的频率都累加起来,可以得到一个最高值1 ;这也叫归一化累积分布函数(CDF)
  举个例子:现在我有一张图像总共有1024个像素点,每个像素点的灰阶都是一样的,那么对应每一色阶的数量都是1024/256=4个,对应的分布直方图如下所示:

在这里插入图片描述

  接下来要对灰度直方图进行归一化处理,也就是限制到[0:1]范围内。我们计算每个色阶中像素所占的总比,也叫做概率,即:每个色阶中像素的概率都是4/1024 = 0.00390625,则归一化后的直方图如下所示:

在这里插入图片描述
  接下来对归一化后的直方图进行累加,画出累计归一化累积分布函数(CDF),如下所示:

5在这里插入图片描述
  这就是一张灰度不变图像归一化后累积分布函数,最高累计值为100%=1 ,接下来我们画出任意一幅图的归一化后的累计分布函数图,matlab代码如下:

% 读取图像
img = imread('...\...\.....\....bmp'); % 将图像转换为灰度图像
grayImg = rgb2gray(img);% 计算灰度图像的直方图
[counts, grayLevels] = imhist(grayImg);% 计算累积分布函数(CDF)
cdf = cumsum(counts);
cdf_normalized = cdf / max(cdf);  % 归一化到 [0, 1] 范围% 显示结果
figure;% 原始图像
subplot(3, 1, 1);
imshow(img);
title('原始图像');% 亮度直方图
subplot(3, 1, 2);
bar(grayLevels, counts, 'FaceColor', [0.2, 0.6, 0.8]);
title('灰度图像直方图');
xlabel('像素数量');
ylabel('色阶');
xlim([0 255]);% 归一化累积分布函数
subplot(3, 1, 3);
plot(grayLevels, cdf_normalized, 'LineWidth', 2);
title('归一化累积分布函数 (CDF)');
xlabel('色阶');
ylabel('累计概率');
xlim([0 255]);
ylim([0 1]);  % 设置 y 轴范围为 [0, 1]
grid on;

在这里插入图片描述

  由此可见,理想情况下的归一化累计分布函数是一条斜直线,而实际的图片大多数都是这种不规则曲线,因此直方图均衡化的目的就是尽量把这种不规则曲线调成直线。

第四步: 映射到新的灰度值

  在得到归一化的 CDF 后,为了将其映射回原始图像的灰度级范围(0 到 255),需要将其乘以 255。具体来说:归一化的 CDF 值是一个小数,乘以 255 后,可以得到一个新的灰度值,范围在 0 到 255 之间。

  为什么要乘以255? 我们画出一副图像的归一化分布函数和灰度一致的图像归一化累计分布函数叠加:

在这里插入图片描述
  橙色曲线是实际图像的累计归一化分布函数,蓝色的为灰度一致的标准累计归一化分布函数,直方图均衡化的目的就是让橙色的曲线变成直线,具体步骤就是:

在这里插入图片描述

  假设这三个点的坐标如上所示,现在要把橙色图片变成直线,有两种方式:

  1. b点往上移动到a点
  2. c点往右移动到a点

  我们可以分析出来第一种方式是不可取的,因为b点的含义表示色阶为15的像素点占比0.13,如果把b点往上移动到0.3,就相当于把色阶为15的像素点数量增加了,那么像素点总共的数量是不变的,这增加的像素点是从哪里来?所以这样不可取。
  第二种方式就是把c点往左移到a点,含义就是色阶26的像素点占比0.3,把这占比0.3的像素点色阶变成15,这样的像素点占比依然是0.3,所以数量是没有变化的。具体公式就是
y = k x = 1 / 255 ∗ x y=kx=1/255 * x y=kx=1/255x

x = 255 ∗ y x = 255 * y x=255y
  matlab代码如下:

% 读取图像
img = imread('...\...\.....\....bmp'); % 将图像转换为灰度图像
grayImg = rgb2gray(img);% 计算灰度图像的直方图
[counts, grayLevels] = imhist(grayImg);% 计算累积分布函数(CDF)
cdf = cumsum(counts);
cdf_normalized = cdf / max(cdf);  % 归一化到 [0, 1] 范围% 进行直方图均衡化
equalizedImg = histeq(grayImg);% 计算均衡化后的直方图
[counts_eq, grayLevels_eq] = imhist(equalizedImg);% 计算均衡化后的累积分布函数(CDF)
cdf_eq = cumsum(counts_eq);
cdf_normalized_eq = cdf_eq / max(cdf_eq);  % 归一化到 [0, 1] 范围% 显示结果
figure;% 原始图像
subplot(3, 2, 1);
imshow(grayImg);
title('原始图像');% 原始图像的灰度直方图
subplot(3, 2, 2);
bar(grayLevels, counts);
title('原始图像的灰度直方图');
xlabel('色阶');
ylabel('像素数量');
xlim([0 255]);% 原始图像的归一化累积分布函数
subplot(3, 2, 3);
bar(grayLevels, cdf_normalized);
title('原始图像的归一化累积分布函数');
xlabel('色阶');
ylabel('累计概率');
xlim([0 255]);
ylim([0 1]);  % 设置 y 轴范围为 [0, 1]% 均衡化后的图像
subplot(3, 2, 4);
imshow(equalizedImg);
title('均衡化后的图像');% 均衡化后的灰度直方图
subplot(3, 2, 5);
bar(grayLevels_eq, counts_eq);
title('均衡化后的灰度直方图');
xlabel('色阶');
ylabel('像素数量');
xlim([0 255]);% 均衡化后的归一化累积分布函数
subplot(3, 2, 6);
bar(grayLevels_eq, cdf_normalized_eq);
title('均衡化后的归一化累积分布函数');
xlabel('色阶');
ylabel('累计概率');
xlim([0 255]);
ylim([0 1]);  % 设置 y 轴范围为 [0, 1]

在这里插入图片描述

四、Verilog实现直方图均衡化

第一步:Verilog实现彩色图像转灰度图像

  这部分和可以直接使用前文《Verilog和Matlab实现RGB888互转YUV444》这个模块,把G、B也换成Y即可,代码如下:

4.1.1Verilog代码

`timescale 1ns / 1ps
module rgb2gray(input                                               clk             ,input                                               rst             ,//输入RGB原始信号input                                               i_data_valid    ,input           [7:0]                               i_data_r        ,input           [7:0]                               i_data_g        ,input           [7:0]                               i_data_b        ,//输出转换后的灰度信号output                                              o_data_valid    ,output          [7:0]                               o_data_r        ,output          [7:0]                               o_data_g        ,output          [7:0]                               o_data_b        
);//Y= 0.299*R + 0.587*G + 0.114*B/****************parameter********************/
parameter   Y_PARA_R    = 306,   // 0.299*1024Y_PARA_G    = 601,   // 0.587*1024Y_PARA_B    = 117;   // 0.114*1024/*******************reg***********************/
reg     [1:0]   ro_data_valid   ;
reg     [17:0]  ro_data_r       ;
reg     [17:0]  r_y1            ;
reg     [17:0]  r_y2            ;
reg     [17:0]  r_y3            ;/******************wire***********************/
/******************assign*********************/
assign o_data_valid = ro_data_valid[1]     ;
assign o_data_r     = ro_data_r[17:10]     ;
assign o_data_g     = ro_data_r[17:10]     ;
assign o_data_b     = ro_data_r[17:10]     ;//1 clock
always @(posedge clk) beginr_y1 = (i_data_r * Y_PARA_R);r_y2 = (i_data_g * Y_PARA_G);r_y3 = (i_data_b * Y_PARA_B);
end//2 clock
always @(posedge clk) beginro_data_r = r_y1 + r_y2 + r_y3;
end//sync_validalways @(posedge clk) beginro_data_valid <= {ro_data_valid[0],i_data_valid};
endendmodule

4.1.2 仿真截图

在这里插入图片描述

在这里插入图片描述
  转换出来的灰度图像和matlab一致。

第二步:Verilog实现统计累计灰度直方图

  用matlab软件实现直方图的统计非常简单,调用一个函数即可。但是FPGA内没有这种函数,只能靠自己计算。实现的思想就是用一个双口RAM,简单双口和真双口都可以:

  • 第一步:把输入的灰度数据作为ram的读地址
  • 第二步:把读出来的数据 + 1
  • 第三步:再把+1后的数据写入相同地址

  需要注意的是,从给出读地址到数据读出来需要花费一个时钟周期,再写入到ram里面也需要花费一个时钟周期,因此当遇到两个连续灰度值一样时,可能会出现漏写。因此再写入ram之前还要判断当前灰度值是否一致,不一样的话就+1,一样的话就+2,连续三个一样的话就+3,以此类推。

4.2.1 verilog代码

  端口定义:

module histogram_stat#(parameter IMG_WIDTH     = 1920,         //输入图像宽度parameter IMG_HEIGHT    = 1280,         //输入图像高度parameter GRAY_LEVEL    = 256           //输入图像灰度等级
)
(input 	wire 			clk 		    ,  input	wire 			rst 		    , input 	wire 			i_hsync	        , //输入图像行同步信号input	wire 			i_vsync	        , //输入图像场同步信号input	wire 			i_data_valid	, //输入图像数据有效信号input 	wire 	[7:0]	i_data 	        , //输入灰度图像数据output 	wire 			o_histo_valid   , //输出累计直方图output 	wire 	[31:0]	o_histo_data	  //输出累计直方图数据  
);

  简单双口ram定义:

cal_ram u0_cal_ram (.clka (clk        ),      // input wire clka.wea  (wr_ram_en  ),      // input wire [0 : 0] wea.addra(wr_ram_addr),      // input wire [7 : 0] addra.dina (wr_ram_data),      // input wire [23 : 0] dina.clkb (clk        ),      // input wire clkb.addrb(rd_ram_addr),      // input wire [7 : 0] addrb.doutb(rd_ram_data)       // output wire [23 : 0] doutb
);

4.2.2 仿真结果

  先打开matlab看直方图和累积直方图以及每一个色阶的数量:

在这里插入图片描述

在这里插入图片描述

  色阶数量分别是:7798,557,14863,7908 …等等。

在这里插入图片描述
  累计直方图是:7798,8355,23218,31126…等等,我们打开仿真波形来观察:

在这里插入图片描述
  我们可以看到,ram从0-255存放的直方图灰度数量和matlab一致,我们接下来看累计直方图:

在这里插入图片描述  我们可以看到,累计直方图数量和matlab也一致,我们用模拟波形来观察:
在这里插入图片描述
  直方图波形和matlab也一致。

在这里插入图片描述
  累计直方图波形和matlab也一致。

第三步:Verilog实现直方图均衡化

  归一化分布函数就是把累计分布函数除以总像素,得到一个小数。由于FPGA不擅长除法,因此我们可以先扩大再右移,例如:

4.3.1 Verilog代码

module cal_cdf#(parameter IMG_WIDTH     = 1920,         //输入图像宽度parameter IMG_HEIGHT    = 1280         //输入图像高度
)
(input                                               clk ,input                                               rst ,input                                               i_histo_valid   ,       //输入累计直方图数据有效信号input           [31:0]                              i_histo_data    ,       //输入累计直方图数据input           [7:0]                               i_src_gray_data   ,     //输入原始灰度图像input                                               i_src_gray_data_valid , //输入原始灰度图像有效信号output  reg                                         o_post_cal_gray_data_valid  , //输出直方图均衡化的output          [23:0]                              o_post_cal_gray_data          //输出均衡化后的图像数据  
);/***************function**************//***************parameter*************/
parameter   const   = 36'd68451041280;   //255*2^28
parameter   cal_cdf = const / (IMG_WIDTH*IMG_HEIGHT);  //  255*2^28/(IMG_WIDTH*IMG_HEIGHT)  15bit

  我们先在上层定义好图像的长和宽,因为直方图均衡最重要的就是 x = 255 ∗ y x = 255 * y x=255y, 因此我们先定义好常数255 * 2^28 ,再除以总像素就得到了x, 再把新的灰度直方图写入到新的ram里,然后让原始灰度数据作为读ram地址,读出来的数值就是需要替换掉的灰度值。

4.3.2 仿真结果

  先来观察我们均衡化后的灰度直方图为:

在这里插入图片描述
  对比matlab均衡化后的直方图:
在这里插入图片描述
  matlab均衡化后的灰度直方图数据为:0、0、1、2、6、8、11、19、24、33、42、51、59、69
  Verilog均衡化后的灰度直方图数据为:0、0、2、3、7、9、12、19、24、34、43、51、60、69
  可以看出我们均衡化后的灰度直方图和matlab均衡化后的灰度直方图有一些细微的差异,这些都是精度带来的差距,可以忽略不计,总体的数据是一致的。

  仿真中,我们将均衡化后的图像生成在本文件夹里,命名为:new_gray_img.bmp,跑完仿真打开文件夹:

在这里插入图片描述
在这里插入图片描述
  我们可以看到均衡化后的图片,我们来对比一下matlab均衡化后的图片:

在这里插入图片描述

在这里插入图片描述
  我们可以看出用Verilog实现的直方图均衡化和matlab一致,我们用matlab统计我们Verilog均衡化后的图像的直方图以及累计直方图,matlab代码如下:

% 读取两幅灰度图像img1 = imread('...\....\.....\.....\gray_image_24bit.bmp'); 
img2 = imread('...\....\.....\.....\new_gray_img.bmp'); % 确保图像是灰度图像
if size(img1, 3) == 3img1 = rgb2gray(img1);
endif size(img2, 3) == 3img2 = rgb2gray(img2);
end% 计算直方图和累计直方图
[counts1, x1] = imhist(img1);
[counts2, x2] = imhist(img2);cumulativeHist1 = cumsum(counts1);
cumulativeHist2 = cumsum(counts2);% 创建一个新的图形窗口
figure;% 显示第一幅图像及其直方图和累计直方图
subplot(2, 3, 1);
imshow(img1);
title('第一幅灰度图像');subplot(2, 3, 2);
bar(x1, counts1, 'FaceColor', 'b');
title('第一幅图像的灰度直方图');
xlabel('灰度值');
ylabel('像素数量');subplot(2, 3, 3);
plot(x1, cumulativeHist1, 'r');
title('第一幅图像的累计直方图');
xlabel('灰度值');
ylabel('累计频数');% 显示第二幅图像及其直方图和累计直方图
subplot(2, 3, 4);
imshow(img2);
title('第二幅灰度图像');subplot(2, 3, 5);
bar(x2, counts2, 'FaceColor', 'g');
title('第二幅图像的灰度直方图');
xlabel('灰度值');
ylabel('像素数量');subplot(2, 3, 6);
plot(x2, cumulativeHist2, 'm');
title('第二幅图像的累计直方图');
xlabel('灰度值');
ylabel('累计频数');% 设置图形窗口的大小
set(gcf, 'Position', [100, 100, 800, 600]);

在这里插入图片描述

  至此,Verilog实现直方图均衡化已完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1536900.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

10.2高斯金字塔-向上取样

实验原理 在OpenCV中&#xff0c;高斯金字塔&#xff08;Gaussian Pyramid&#xff09;和上采样&#xff08;Upsampling&#xff09;是图像处理中的常见技术&#xff0c;它们经常用于图像的多分辨率分析。高斯金字塔主要用于图像的多尺度表示&#xff0c;而上采样则是将图像放…

Porcupine - 语音关键词唤醒引擎

文章目录 一、关于 Porcupine特点用例尝试一下 语言支持性能 二、Demo1、Python Demo2、iOS DemoBackgroundService DemoForegroundApp Demo 3、网页 Demo3.1 Vanilla JavaScript 和 HTML3.2 Vue Demos 三、SDK - Python 一、关于 Porcupine Porcupine 是一个高度准确和轻量级…

数据结构之线性表(python)

华子目录 线性表的定义前驱与后继 1.顺序表&#xff08;顺序存储结构&#xff09;python列表与数组的区别列表数组 1.1插入数据实例 1.2删除元素实例 1.3查找元素1.4修改元素1.5综合示例 2.单链表2.1单链表的初始化2.2插入元素示例注意 2.3删除元素示例 2.4修改元素2.5查找元素…

图解Self-Attention和代码实现,大语言模型基础思维导图

文章目录 1 Self-Attention的概念注意优缺点 2 Self-Attention的原理Q,K,V, and Self-Attention计算公式代码实现 Self-Attention的计算细节输入是如何Embedding的&#xff1f;Word EmbeddingsSentence EmbeddingsPre-trained Embeddings SelfAttention是如何计算的计算图 4 Se…

无畏契约 (Valorant)YOLO 模型数据集

4万数据集 无畏契约 Valorant YOLO 模型 数据集 截图大小&#xff1a;256x256 截图数量&#xff1a;40000包含保安拌线&#xff0c;被闪被黑&#xff0c;蝰蛇大招内 模型类别&#xff1a;2类 头身类 1身0头 人物&#xff1a;黄色色盲 已添加部分负样本&#xff0c;防止识别除敌…

数据结构——“二叉搜索树”

二叉搜索树是一个很重要的数据结构&#xff0c;它的特殊结构可以在很短的时间复杂度找到我们想要的数据。最坏情况下的时间复杂度是O(n)&#xff0c;最好是O(logn)。接下来看一看它的接口函数的实现。 为了使用方便&#xff0c;这里采用模版的方式&#xff1a; 一、节点 temp…

docker部署Stirling-PDF

github网址&#xff1a; GitHub - Stirling-Tools/Stirling-PDF: #1 Locally hosted web application that allows you to perform various operations on PDF files 1、官方docker镜像无法拉取&#xff0c;使用别人阿里云私人镜像仓库下载Stirling-PDF镜像&#xff1a; regi…

微服务以及注册中心

一、什么是微服务 微服务是指开发一个单个小型的但有业务功能的服务&#xff0c;每个服务都有自己的处理和轻量通讯机制&#xff0c;可以部署在单个或多个服务器上。微服务也指一种松耦合的、有一定的有界上下文的面向服务架构。也就是说&#xff0c;如果每个服务都要同时修改…

Objects as Points基于中心点的目标检测方法CenterNet—CVPR2019

Anchor Free目标检测算法—CenterNet Objects as Points论文解析 Anchor Free和Anchor Base方法的区别在于是否在检测的过程中生成大量的先验框。CenterNet直接预测物体的中心点的位置坐标。 CenterNet本质上类似于一种关键点的识别。识别的是物体的中心点位置。 有了中心点之…

AI助力遥感影像智能分析计算,基于高精度YOLOv5全系列参数【n/s/m/l/x】模型开发构建卫星遥感拍摄场景下地面建筑物智能化分割检测识别系统

随着科技的飞速发展&#xff0c;卫星遥感技术已成为获取地球表面信息的重要手段之一。卫星遥感图像以其覆盖范围广、数据量大、信息丰富等特点&#xff0c;在环境监测、城市规划、灾害评估等多个领域发挥着不可替代的作用。然而&#xff0c;面对海量的卫星图像数据&#xff0c;…

wx小程序渗透思路

免责声明:本文仅做分享! 目录 WX小程序源代码 wx小程序目录位置: 反编译: e0e1-wx.py工具 unveilr.exe工具 查看源代码: 微信开发者工具: WX抓包 Fiddler抓包 官网下载 下载证书 操作: bp proxifier bp:(代理抓包) proxifier:(本地代理) WX小程序源代码 其实就…

程序修改题(41-50)

第四十一题 题目 给定程序modi1.c的主函数中&#xff0c;将a、b、c三个结点链成一个单向链表&#xff0c;并给各结点的数据域赋值&#xff0c;函数fun()的作用是:累加链表结点数据域中的数据作为函数值返回。 #include <stdio.h> typedef struct list { int data…

【数据结构-扫描线】力扣57. 插入区间

给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区间的开始和…

李宏毅结构化学习 02

文章目录 一、上篇博文复习二、Separable Case三、Non-separable Case四、Considering Errors五、Regularization六、Structured SVM七、Cutting Plane Algorithm for Structured SVM八、Multi-class and binary SVM九、Beyond Structured SVM 一、上篇博文复习 图中x表示输入的…

Android Framework(六)WMS-窗口显示流程——窗口内容绘制与显示

文章目录 窗口显示流程明确目标 窗户内容绘制与显示流程窗口Surface状态完整流程图 应用端处理finishDrawingWindow 的触发 system_service处理WindowState状态 -- COMMIT_DRAW_PENDING本次layout 流程简述 窗口显示流程 目前窗口的显示到了最后一步。 在 addWindow 流程中&…

基于Python的自然语言处理系列(10):使用双向LSTM进行文本分类

在前一篇文章中&#xff0c;我们介绍了如何使用RNN进行文本分类。在这篇文章中&#xff0c;我们将进一步优化模型&#xff0c;使用双向多层LSTM来替代RNN&#xff0c;从而提高模型在序列数据上的表现。LSTM通过引入一个额外的记忆单元&#xff08;cell state&#xff09;来解决…

24.Redis实现全局唯一ID

是一种分布式系统下用来生成全局唯一ID的工具。 特点 1.唯一性 2.高可用 3.高性能 4.递增性&#xff0c;数据也要保持一种递增&#xff0c;有利于数据库进行查询。 5.安全性 全局唯一ID的生成策略 1.UUID(没有顺序&#xff0c;字符串类型&#xff0c;效率不高) 2.Redis…

【电路笔记】-差分运算放大器

差分运算放大器 文章目录 差分运算放大器1、概述2、差分运算放大器表示2.1 差分模式2.2 减法器模式3、差分放大器示例3.1 相关电阻3.2 惠斯通桥3.3 光/温度检测4、仪表放大器5、总结1、概述 在之前的文章中,我们讨论了反相运算放大器和同相运算放大器,我们考虑了在运算放大器…

floodfill算法(二)

目录 一、太平洋大西洋水流问题 1. 题目链接&#xff1a;417. 太平洋大西洋水流问题 2. 题目描述&#xff1a; 3. 解法 &#x1f334;算法思路&#xff1a; &#x1f334;算法代码&#xff1a; 二、扫雷游戏 1. 题目链接&#xff1a;529. 扫雷游戏 2. 题目描述&#xf…

softmax回归的从零实现(附代码)

softmax回归是一个多分类模型&#xff0c;但是他跟线性回归一样将输入特征与权重做线性叠加&#xff0c;与线性不同的是他有多个输出&#xff0c;输出的个数对应分类标签的个数&#xff0c;比如四个特征和三种输出动物类别&#xff0c;则权重包含12个标量&#xff08;带下标的w…