如何在MATLAB中实现录制视频的圆形裁剪?
MATLAB视频圆形裁剪代码中ci和gray_frame行的解释
先说明原代码的问题
原代码目前无法正常运行,存在三个关键问题:
- 缺少
xx和yy坐标网格的定义,这是实现圆形裁剪的必要前提 - 变量名拼写错误:
grey_frame应该写成gray_frame(前面定义的灰度图变量是gray_frame) ci的定义放在while循环内属于冗余操作,可以移到循环外提升效率
1. ci = [638, 484, 512.75]; 行的含义
这行是定义圆形裁剪的核心参数数组,三个元素的意义分别是:
ci(1):圆形裁剪区域的半径(单位:像素,这里是638像素)ci(2):圆形区域的中心行坐标(MATLAB图像的行号从上到下递增,这里指第484行)ci(3):圆形区域的中心列坐标(MATLAB图像的列号从左到右递增,这里指第512.75列)
2. gray_frame = grey_frame((xx.^2 + yy.^2)<ci(1)^2); 行的含义
这行的本意是提取圆形区域内的像素,但写法有问题,拆解来看:
xx.^2 + yy.^2:计算每个像素坐标到圆心的距离平方(用平方比较是为了避免开根号,提升计算速度)< ci(1)^2:判断当前像素是否在圆形区域内(距离圆心的平方小于半径平方,就属于圆内区域)- 用这个逻辑数组索引灰度图,会把所有圆内的像素提取出来,但直接这样写会把二维图像拉成一维向量,丢失原有的图像形状。
正确的圆形裁剪写法
如果要保留图像的二维结构,应该先创建掩码,再应用到灰度图上:
% 先创建图像的坐标网格 [yy, xx] = meshgrid(1:size(gray_frame, 1), 1:size(gray_frame, 2)); % 把坐标转换为以圆心为原点的相对坐标 xx = xx - ci(3); yy = yy - ci(2); % 生成圆形掩码:圆内为true,圆外为false mask = (xx.^2 + yy.^2) < ci(1)^2; % 对灰度图做裁剪,圆外像素设为0(也可以设为其他背景值) cropped_gray_frame = gray_frame; cropped_gray_frame(~mask) = 0;
如果要提取圆内区域并自动裁剪到最小包围矩形,可以用:
[rows, cols] = find(mask); cropped_gray_frame = gray_frame(min(rows):max(rows), min(cols):max(cols));
修正后的完整循环代码示例
clear all close all clc v = VideoReader("SquareWaveWithPlasticBall_90SLPM_Ceramic_16Hz_2.5G_10FPS.mp4"); i = 0; % 把ci定义移到循环外,避免重复定义 ci = [638, 484, 512.75]; while hasFrame(v) frame = readFrame(v); gray_frame = rgb2gray(frame); % 圆形裁剪部分 [yy, xx] = meshgrid(1:size(gray_frame, 1), 1:size(gray_frame, 2)); xx = xx - ci(3); yy = yy - ci(2); mask = (xx.^2 + yy.^2) < ci(1)^2; cropped_gray_frame = gray_frame; cropped_gray_frame(~mask) = 0; binary_frame = imbinarize(cropped_gray_frame, 0.3) ; file = sprintf("a_frame_%d",i); myFolderpath = 'D:\MichaelJ\test4\BinarizedImages\'; FILENAME = string(strcat(myFolderpath, file, '.png')); imwrite(binary_frame, FILENAME); i = i + 1; end clear reader
内容的提问来源于stack exchange,提问作者Michael W. Jordan
相关产品推荐
相关产品推荐

