matlab截取需要的图片

如果一幅图中只有一小部分图像你感兴趣(你想研究的部分),那么截图工具就可以了,但是如果你想知道这个区域在原图像中的坐标位置呢? 这可是截图工具所办不到的,前段时间我就需要这个功能,于是将其用Matlab实现。

其实只要用到Matlab中的两个函数:

函数: imrect
函数: getPosition
如果要截取其中的部分图像,就离不开下面的函数:

函数: imcrop
代码实现

clc;
clear;
close all;
%----------------------------------------
%                Matlab截图程序
%----------------------------------------

[filename, pathname] = uigetfile({'*.jpg'; '*.bmp'; '*.gif'; '*.png' }, '选择图片');
%没有图像
if filename == 0
    return;
end

src = imread([pathname, filename]);
[m, n, z] = size(src);
figure(1)
imshow(src)%显示原图像
%----------------------------------------
%画图后:
h=imrect;%鼠标变成十字,用来选取感兴趣区域

%----------------------------------------
%图中就会出现可以拖动以及改变大小的矩形框,选好位置后:
%---------------------------------------- 
pos=getPosition(h);

%---------------------------------------- 
%pos有四个值,分别是矩形框的左下角点的坐标 x y 和 框的 宽度和高度
%---------------------------------------- 

%---------------------------------------- 
%拷贝选取图片
%---------------------------------------- 
imCp = imcrop( src, pos );
figure(2)
imshow(imCp);

效果展示

图中的区域信息为:

pos =

  255.8263   65.1737   87.5789   87.5789
%    x          y        dx         dy
%左上角点(x,y), 区域长宽(dx,dy)

这里的结果是带小数点的,我需要整数的坐标,使用代码进行截图后是整数刚好是整数的,估计跟图像的格式有关?

这里写图片描述

转载自 祥的博客

原文链接:http://blog.youkuaiyun.com/humanking7/article/details/46822349

<think> 我们使用MATLAB截取图片(即图像裁剪)。在MATLAB中,我们可以使用`imcrop`函数来实现这个功能。 步骤: 1. 读取图像:使用`imread`函数读取图像文件。 2. 显示图像(可选):使用`imshow`显示图像,然后通过交互方式选择裁剪区域,或者直接指定裁剪区域。 3. 裁剪图像:使用`imcrop`函数进行裁剪。有两种方式: a. 交互式:不指定裁剪区域,函数会显示图像并允许用户用鼠标选择矩形区域。 b. 指定区域:直接给出一个矩形区域[xmin, ymin, width, height]。 4. 保存裁剪后的图像(可选):使用`imwrite`函数。 下面给出两种方式的代码示例: 方式1:交互式裁剪 方式2:指定裁剪区域 注意:在MATLAB中,图像矩阵的行对应y坐标,列对应x坐标。而裁剪区域通常表示为[xmin, ymin, width, height]。 其中,(xmin, ymin)是矩形左上角的坐标,width和height分别表示矩形的宽度和高度。 示例代码: 交互式裁剪: ```matlab % 读取图像 I = imread('example.jpg'); % 显示图像并交互式选择裁剪区域 figure; imshow(I); title('请选择要裁剪的区域'); % 交互式选择区域,返回裁剪区域的矩形和选中的区域图像 % 用户可以用鼠标拖动选择矩形区域,然后双击或右键选择“裁剪图像” [I_cropped, rect] = imcrop(I); % 显示裁剪后的图像 figure; imshow(I_cropped); title('裁剪后的图像'); % 保存裁剪后的图像 imwrite(I_cropped, 'cropped_example.jpg'); ``` 指定区域裁剪: 假设我们想要裁剪的区域为:从左上角(100, 50)开始,宽度为200,高度为300的区域。 注意:这里的坐标原点在左上角,x向右为正,y向下为正。 ```matlab % 读取图像 I = imread('example.jpg'); % 指定裁剪区域 [xmin, ymin, width, height] rect = [100, 50, 200, 300]; % 裁剪图像 I_cropped = imcrop(I, rect); % 显示裁剪后的图像 figure; imshow(I_cropped); title('裁剪后的图像'); % 保存 imwrite(I_cropped, 'cropped_example.jpg'); ``` 注意:在指定区域裁剪时,如果指定的区域超出了图像边界,MATLAB会裁剪出尽可能大的区域(即超出部分被忽略)。 解释代码: 1. `imread`:读取图像文件,返回一个图像矩阵。 2. `imshow`:显示图像。 3. `imcrop`:有两种调用方式: - 方式一:`[J, rect] = imcrop(I)` 显示图像I,并允许用户交互选择区域,返回裁剪后的图像J和区域rect。 - 方式二:`J = imcrop(I, rect)` 根据指定的矩形区域rect裁剪图像I,返回裁剪后的图像J。 4. `imwrite`:将图像矩阵写入文件。 如果图像是索引图像,需要注意处理方式。但通常我们处理的是RGB图像或灰度图像。 另外,如果不想显示图像,而想直接指定区域裁剪,那么使用第二种方式。 问题:如果图像很大,我们可能无法准确知道要裁剪的区域坐标,这时可以先显示图像,然后通过`ginput`函数获取坐标点,再计算矩形区域。但通常交互式裁剪更方便。 下面给出一个使用`ginput`确定两个点(左上角和右下角)然后计算矩形区域的示例: ```matlab % 读取图像 I = imread('example.jpg'); % 显示图像 imshow(I); title('请点击左上角和右下角确定裁剪区域'); % 获取两个点 points = ginput(2); % 排序,使第一个点为左上角,第二个点为右下角 x1 = min(points(1,1), points(2,1)); x2 = max(points(1,1), points(2,1)); y1 = min(points(1,2), points(2,2)); y2 = max(points(1,2), points(2,2)); % 计算矩形区域 [xmin, ymin, width, height] rect = [x1, y1, x2-x1, y2-y1]; % 裁剪 I_cropped = imcrop(I, rect); % 显示裁剪后的图像 figure; imshow(I_cropped); % 保存 imwrite(I_cropped, 'cropped_example.jpg'); ``` 这个例子中,用户点击两个点,程序自动计算出矩形区域,然后进行裁剪。 根据要求,最后需要提出相关问题。 §§相关问题§§: 1. MATLAB中如何批量裁剪多张图片? 2. 在MATLAB中,除了`imcrop`函数,还有其他方法可以实现图像裁剪吗? 3. 如何保证裁剪区域不超出图像边界? 4. 在MATLAB中如何实现图像的旋转裁剪? </think> 在MATLAB截取图片(即图像裁剪)可以通过`imcrop`函数实现。以下是一个完整的解决方案,包含交互式裁剪和程序化裁剪两种方法: ### 方法1:交互式裁剪(手动选择区域) ```matlab % 读取图像 originalImg = imread('your_image.jpg'); % 显示图像并手动选择裁剪区域 figure; imshow(originalImg); title('请用鼠标拖选裁剪区域'); [croppedImg, rect] = imcrop(); % 手动选择区域 % 显示并保存结果 figure; imshow(croppedImg); title('裁剪后的图像'); imwrite(croppedImg, 'cropped_image.jpg'); ``` ### 方法2:程序化裁剪(指定坐标区域) ```matlab % 读取图像 originalImg = imread('your_image.jpg'); % 定义裁剪区域 [x_min, y_min, width, height] cropArea = [100, 150, 300, 200]; % 自定义坐标 % 执行裁剪 croppedImg = imcrop(originalImg, cropArea); % 显示并保存结果 figure; subplot(1,2,1); imshow(originalImg); title('原图'); subplot(1,2,2); imshow(croppedImg); title('裁剪后'); imwrite(croppedImg, 'cropped_image.jpg'); ``` ### 代码解释: 1. **`imread`函数**:读取图像文件(支持JPG/PNG/BMP等格式) 2. **`imcrop`函数**: - 无参数调用:打开交互式窗口,鼠标拖选矩形区域 - 带参数调用:直接按指定区域裁剪 - 返回值`rect`:存储选区坐标信息[x,y,width,height] 3. **`imshow`函数**:显示图像结果 4. **`imwrite`函数**:保存裁剪后的图像 5. **坐标系统**: - 原点(0,0)在图像左上角 - x轴向右延伸,y轴向下延伸 - 坐标单位是像素 ### 注意事项: 1. 裁剪区域不能超出图像边界 2. 彩色图像会自动处理所有通道(RGB) 3. 交互模式下可通过双击或回车确认选区 4. 使用`ginput`函数可获取精确坐标点: ```matlab figure; imshow(img); [x,y] = ginput(2); % 获取两个点(左上角和右下角) rect = [min(x), min(y), max(x)-min(x), max(y)-min(y)]; ``` ### 批量裁剪示例: ```matlab files = dir('*.jpg'); % 获取所有JPG文件 for i = 1:length(files) img = imread(files(i).name); cropped = imcrop(img, [50 50 400 300]); % 固定裁剪区域 imwrite(cropped, sprintf('cropped_%d.jpg', i)); end ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值