数字图像处理(13):图像裁剪

(1)图像裁剪是一种用于图像处理的技术,旨在从原始图像中裁剪出一部分区域,同时舍弃不相关的部分。这种算法广泛应用与各种场景,例如:人脸识别、目标跟踪、图像分割等领域。

(2)图像裁剪算法的基本原理是根据一定的规则和条件来确定裁剪区域,然后将该区域内的像素保留下来,将区域外的像素丢弃,图像内像素坐标,一般是以左上角顶点为原点,如下图所示:

(3)matlab实现:

复制代码
% 定义输入输出路径
input_path = 'D:\FPGA\Image processing\5_cropped\matlab\1_1920x1080.bmp';
output_dir = 'D:\FPGA\Image processing\5_cropped\matlab\';

% 读取图像
img = imread(input_path);

% 显示原始图像尺寸信息
[height, width, channels] = size(img);
disp(['原始图像分辨率: ', num2str(width), 'x', num2str(height)]);

% 计算裁剪位置(居中裁剪)
start_row = floor((height - 720) / 2);
start_col = floor((width - 1280) / 2);

% 裁剪图像为精确的1280x720
cropped_image = img(start_row+(1:720), start_col+(1:1280), :);

% 创建白色背景的大图
figure('Name', '原图与裁剪结果对比', 'NumberTitle', 'off', ...
       'Position', [100, 100, 1600, 600], 'Color', 'white');

% 左侧显示原图
subplot('Position', [0.05, 0.1, 0.45, 0.8]);
imshow(img);
title('原始图像 (1920x1080)', 'FontSize', 12, 'FontName', '宋体');

% 右侧显示裁剪结果
subplot('Position', [0.55, 0.1, 0.45*1280/1920, 0.8*720/1080]);
imshow(cropped_image);
title('裁剪后的图像 (1280x720)', 'FontSize', 12, 'FontName', '宋体');

% 保存裁剪后的图像
output_filename = fullfile(output_dir, 'cropped_1280x720.bmp');
imwrite(cropped_image, output_filename);

% 保存对比图
saveas(gcf, fullfile(output_dir, '对比图.bmp'));

% 显示裁剪后的尺寸信息
[crop_h, crop_w, ~] = size(cropped_image);
disp(['裁剪后图像分辨率: ', num2str(crop_w), 'x', num2str(crop_h)]);
disp(['裁剪结果已保存至: ', output_filename]);
disp('处理完成!');

(4)FPGA仿真实现:

复制代码
module cropped
(
    input   wire            clk         ,
    input   wire            reset_n     ,
    input   wire    [10:0]  img_width   ,
    input   wire    [10:0]  img_height  ,
    input   wire    [10:0]  img_x_start ,
    input   wire    [10:0]  img_x_end   ,
    input   wire    [10:0]  img_y_start ,
    input   wire    [10:0]  img_y_end   ,
    input   wire            valid_i     ,
    input   wire    [23:0]  img_data_i  ,
    
    output  reg             valid_o     ,
    output  reg     [23:0]  img_data_o
    
);

reg [10:0]  h_cnt,v_cnt;
wire        display_valid;

always@(posedge clk or negedge reset_n)
    if(!reset_n)
        h_cnt <= 11'd0;
    else if(valid_i && (h_cnt == img_width - 11'd1))
        h_cnt <= 11'd0;
    else if(valid_i)
        h_cnt <= h_cnt + 11'd1;
    else 
        h_cnt <= h_cnt;
      
always@(posedge clk or negedge reset_n)
    if(!reset_n)
        v_cnt <= 11'd0;      
    else if(valid_i && (h_cnt == img_width - 11'd1) && (v_cnt == img_height - 11'd1))
        v_cnt <= 11'd0;
    else if(valid_i && (h_cnt == img_width - 11'd1))
        v_cnt <= v_cnt + 11'd1;
    else if(valid_i)
        v_cnt <= v_cnt;
    else 
        v_cnt <= v_cnt;
        
assign display_valid = (h_cnt >= img_x_start) && (h_cnt < img_x_end) 
                && (v_cnt >= img_y_start) && (v_cnt < img_y_end);
                    
always@(posedge clk or negedge reset_n)
    if(!reset_n)
        valid_o <= 1'd0;
    else if(valid_i && display_valid)
        valid_o <= valid_i;
    else 
        valid_o <= 1'd0;
        
always@(posedge clk or negedge reset_n)
    if(!reset_n)
        img_data_o <= 24'd0;
    else if(valid_i && display_valid)
        img_data_o <= img_data_i;
    else 
        img_data_o <= 24'd0;

endmodule

测试文件沿用之前的bmp读写文件,修改如下几个参数:

(5)上板验证(沿用先前24色数据的bmp_uart_ddr_hdmi顶层,增添行列设置)

相关推荐
2601_962293533 小时前
第3.7章 机器人第三方库实战总结(七):OpenCV视觉SLAM核心库详解:API速查+源码实例+避坑指南
图像处理·opencv·计算机视觉·slam·第三方库
my_daling4 小时前
紫光FPGA远程升级注意事项(关于GTP_CFGCLK原语使用问题)
笔记·学习·fpga开发
matlab代码11 小时前
基于数字图像处理的表面缺陷检测设计(点线面)【源码70期】
图像处理·opencv·计算机视觉
2601_9623004718 小时前
halconpython联合开发网_C#与Halcon联合开发实例,并做了可移动的ROI库
图像处理·c·halcon·软件开发·roi
Evand J20 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
Riwuarua1 天前
从近似0基础开始FPGA开发 -- part.11 AXI总线协议与工程应用
fpga开发
自小吃多1 天前
高云 FPGA 添加时序约束笔记
笔记·fpga开发
A hao1 天前
LED视频处理器中帧率与刷新率的区别
大数据·图像处理·人工智能·音视频
m0_614523551 天前
批量商品图换背景如何返工:建立逐图状态和问题清单
图像处理
学习FPGA的电气小兴兴1 天前
基于FPGA的CORDIC旋转模式实现sin和cos运算
fpga开发·信号处理·数字信号处理·verilog·fpga·verilog hdl·cordic