OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)

news2024/11/19 23:35:16

裁剪是为了从图像中删除所有不需要的物体或区域。甚至突出显示图像的特定功能。

使用OpenCV裁剪没有特定的功能,NumPy数组切片是工作。读取的每个图像都存储在2D数组中(对于每个颜色通道)。只需指定要裁剪区域的高度和宽度(以像素为单位),就可以完成

使用OpenCV裁剪图像

  • 1.使用OpenCV裁剪
  • 2.使用裁剪功能对图像进行划分

1.使用OpenCV裁剪

以下代码片段展示了如何使用Python和C++裁剪图像。在例子的进一步,您将详细了解这些。
Python

# Import packages
import cv2
import numpy as np
 
img = cv2.imread('test.jpg')
print(img.shape) # Print image shape
cv2.imshow("original", img)
 
# Cropping an image
cropped_image = img[400:1200, 350:700]
 
# Display cropped image
cv2.imshow("cropped", cropped_image)
 
# Save the cropped image
cv2.imwrite("Cropped Image.jpg", cropped_image)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

C++

// Include Libraries
#include<opencv2/opencv.hpp>
#include<iostream>
 
// Namespace nullifies the use of cv::function();
using namespace std;
using namespace cv;
 
int main()
{
  // Read image
  Mat img = imread("test.jpg");
  cout << "Width : " << img.size().width << endl;
  cout << "Height: " << img.size().height << endl;
  cout<<"Channels: :"<< img.channels() << endl;
  // Crop image
  Mat cropped_image = img(Range(400,1200), Range(350,700));
 
  //display image
  imshow(" Original Image", img);
  imshow("Cropped Image", cropped_image);
 
  //Save the cropped Image
  imwrite("Cropped Image.jpg", cropped_image);
 
  // 0 means loop infinitely
  waitKey(0);
  destroyAllWindows();
  return 0;
}

上面的代码读取并显示图像及其尺寸。尺寸不仅包括二维矩阵的宽度和高度,还包括通道的数量(例如,RGB图像有3个通道——红色、绿色和蓝色)。

让我们尝试裁剪图像中包含美女的部分。

Python

cropped_image = img[400:1200, 350:700] # Slicing to crop the image
 
# Display the cropped image
cv2.imshow("cropped", cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows() 

C++

Mat crop = img(Range(400,1200),Range(350,700)); // Slicing to crop the image
 
// Display the cropped image
imshow("Cropped Image", crop);
 
waitKey(0);
destroyAllWindows();
return 0;

在这里插入图片描述
在Python中,您可以使用与NumPy数组切片相同的方法裁剪图像。要切片数组,您需要指定第一维和第二维的开始和结束索引。

  • 第一个维度总是行数或图像的高度。
  • 第二个维度是列数或图像的宽度。

如何剪切图像的NumPy数组?查看此示例中的语法:

cropped = img[start_row:end_row, start_col:end_col]

在C++中,我们使用Range()函数裁剪图像。

  • Python同理一样,它也应用切片。
  • 在这里,图像也按照上述相同的约定作为二维矩阵读取。

以下是裁剪图像的C++语法:

img(Range(start_row, end_row), Range(start_col, end_col))

2.使用裁剪功能对图像进行划分

在OpenCV中裁剪的一个实际应用可以是将图像划分为大小相同图像块。使用循环从图像中裁剪片段。首先从图像的形状中获取所需图像块的高度和宽度

Python

img =  cv2.imread("test_cropped.jpg")
image_copy = img.copy() 
imgheight=img.shape[0]
imgwidth=img.shape[1]

C++

Mat img = imread("test_cropped.jpg");
Mat image_copy = img.clone();
int imgheight = img.rows;
int imgwidth = img.cols;

加载高度和宽度,以指定需要裁剪较小图像块的范围。为此,使用Python中的range()函数。现在,使用两个循环裁剪:

  • 宽度范围
  • 高度范围

已知原图像瘩高度宽度为(1350,1080),我们使用的图像块的高度和宽度分别为(270,216)。内外循环的步幅(我们在图像中移动的像素数)也就是划分下来,有25个图像块。(拼图一样)

Python

M = 216
N = 270
x1 = 0
y1 = 0

for y in range(0, imgheight, M):
    for x in range(0, imgwidth, N):
        if (imgheight - y) < M or (imgwidth - x) < N:
            break

        y1 = y + M
        x1 = x + N

        # check whether the patch width or height exceeds the image width or height
        if x1 >= imgwidth and y1 >= imgheight:
            x1 = imgwidth - 1
            y1 = imgheight - 1
            # Crop into patches of size MxN
            tiles = image_copy[y:y + M, x:x + N]
            # Save each patch into file directory
            cv2.imwrite(str(x) + '_' + str(y) + '.jpg', tiles)
            cv2.rectangle(img, (x, y), (x1, y1), (0, 255, 0), 1)
        elif y1 >= imgheight:  # when patch height exceeds the image height
            y1 = imgheight - 1
            # Crop into patches of size MxN
            tiles = image_copy[y:y + M, x:x + N]
            # Save each patch into file directory
            cv2.imwrite(str(x) + '_' + str(y) + '.jpg', tiles)
            cv2.rectangle(img, (x, y), (x1, y1), (0, 255, 0), 1)
        elif x1 >= imgwidth:  # when patch width exceeds the image width
            x1 = imgwidth - 1
            # Crop into patches of size MxN
            tiles = image_copy[y:y + M, x:x + N]
            # Save each patch into file directory
            cv2.imwrite(str(x) + '_' + str(y) + '.jpg', tiles)
            cv2.rectangle(img, (x, y), (x1, y1), (0, 255, 0), 1)
        else:
            # Crop into patches of size MxN
            tiles = image_copy[y:y + M, x:x + N]
            # Save each patch into file directory
            cv2.imwrite(str(x) + '_' + str(y) + '.jpg', tiles)
            cv2.rectangle(img, (x, y), (x1, y1), (0, 255, 0), 1)

C++

int M = 216;
int N = 270;
 
int x1 = 0;
int y1 = 0;
for (int y = 0; y<imgheight; y=y+M)
{
    for (int x = 0; x<imgwidth; x=x+N)
    {
        if ((imgheight - y) < M || (imgwidth - x) < N)
        {
            break;
        }
        y1 = y + M;
        x1 = x + N;
        string a = to_string(x);
        string b = to_string(y);
 
        if (x1 >= imgwidth && y1 >= imgheight)
        {
            x = imgwidth - 1;
            y = imgheight - 1;
            x1 = imgwidth - 1;
            y1 = imgheight - 1;
 
            // crop the patches of size MxN
            Mat tiles = image_copy(Range(y, imgheight), Range(x, imgwidth));
            //save each patches into file directory
            imwrite("saved_patches/tile" + a + '_' + b + ".jpg", tiles);  
            rectangle(img, Point(x,y), Point(x1,y1), Scalar(0,255,0), 1);    
        }
        else if (y1 >= imgheight)
        {
            y = imgheight - 1;
            y1 = imgheight - 1;
 
            // crop the patches of size MxN
            Mat tiles = image_copy(Range(y, imgheight), Range(x, x+N));
            //save each patches into file directory
            imwrite("saved_patches/tile" + a + '_' + b + ".jpg", tiles);  
            rectangle(img, Point(x,y), Point(x1,y1), Scalar(0,255,0), 1);    
        }
        else if (x1 >= imgwidth)
        {
            x = imgwidth - 1;   
            x1 = imgwidth - 1;
 
            // crop the patches of size MxN
            Mat tiles = image_copy(Range(y, y+M), Range(x, imgwidth));
            //save each patches into file directory
            imwrite("saved_patches/tile" + a + '_' + b + ".jpg", tiles);  
            rectangle(img, Point(x,y), Point(x1,y1), Scalar(0,255,0), 1);    
        }
        else
        {
            // crop the patches of size MxN
            Mat tiles = image_copy(Range(y, y+M), Range(x, x+N));
            //save each patches into file directory
            imwrite("saved_patches/tile" + a + '_' + b + ".jpg", tiles);  
            rectangle(img, Point(x,y), Point(x1,y1), Scalar(0,255,0), 1);    
        }
    }
}

接下来,使用imshow()函数显示图像块拼图。使用imwrite()函数将其保存到文件目录中。

Python

#Save full image into file directory
cv2.imshow("Patched Image",img)
cv2.imwrite("patched.jpg",img)
  
cv2.waitKey()
cv2.destroyAllWindows()

C++

imshow("Patched Image", img);
imwrite("patched.jpg",img);
waitKey();
destroyAllWindows();

在这里插入图片描述

Python

C++

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

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

相关文章

Linux安装 dotnet sdk 6.0

一、离线安装&#xff08;推荐&#xff09; 1、下载安装包 官网下载地址 2、安装 &#xff08;1&#xff09;将安装包上传到linux服务器上的指定目录&#xff0c;如&#xff1a;/root/dotnet/sdk&#xff0c;运行下面指令解压即可 # cd /root/dotnet/sdk # mkdir -p $HOM…

毕设项目 - SSM留学生交流互动论坛系统(含源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.2.1 系统开发流程3.2.2 学生登录流程3.2.3 系统操作流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新…

微服务的好处(优点)有哪些?

显然&#xff0c;随着系统复杂度的提升&#xff0c;以及对系统扩展性的要求越来越高&#xff0c;微服务化是一个很好的方向&#xff0c;但除此之外&#xff0c;微服务还会给我们带来哪些好处&#xff1f; 独立&#xff0c;独立&#xff0c;还是独立 我们说微服务打响的是各自…

虹科方案|具有RDMA复制写入日志的高可用性HDD存储集群可提供出色的性能

一、引言 Open-E、Western Digital 和 ATTO 数据存储专家和工程师联手推出了基于 HDD 的数据存储设备&#xff0c;该设备结合Western Digital Ultrastar Data60 JBOD 的海量容量和Ultrastar 系列 HDD 以及加速的性能&#xff0c;这得益于ATTO HBA SAS 控制器和 100GbE NIC&…

制作一个简单HTML大学生抗疫感动专题网页(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

一文刨析C/C++全局常量的定义

目录 文件特性常量 文件常量 堆常量 EOF, WEOF errno 常量 数学常量 数学错误常量 共享常量 转换模式常量 文件读/写访问常量 NULL (CRT) stdin, stdout, stderr 文件特性常量 语法 #include <io.h> 备注 这些常量指定由函数指定的文件或目录的当前特性。…

软件杂志软件杂志社软件编辑部2022年第9期目录

基金项目论文 基于Blockly和树莓派的多模态控制智能车 杨杰;宋俊炜;吴思玮;魏苏州;赖晓晨; 1-313 基于神经网络的网络异常研究与实现 郭稼逸; 4-6《软件》投稿&#xff1a;cnqikantg126.com 计算机视觉技术在电力系统自动化中的应用 陈海远;顾雅青; 7-9 基于优…

【吴恩达机器学习笔记】十二、降维

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

PM说 | 一文全方位解析C端用户的评论功能!

随着各种自媒体、资讯平台的肆意发展&#xff0c;评论区逐渐成为各路英雄豪杰的必争之地。在评论区&#xff0c;我们可以与”“杠精”来一场遭遇战&#xff0c;邂逅文人墨客&#xff0c;看一场舌战群雄大戏。 评论区越热闹&#xff0c;说明产品越活跃&#xff0c;用户粘性高&a…

iwebsec靶场 文件上传漏洞通关笔记1-第01关 前端js过滤绕过

目录 第01关 前端js过滤绕过 1.禁用js法 &#xff08;1&#xff09;禁用js &#xff08;2&#xff09;刷新页面使生效 &#xff08;3&#xff09;上传脚本 &#xff08;4&#xff09;开启js并刷新页面 2.修改页面法1 &#xff08;1&#xff09;右键查询元素 &#xff…

docker安装和info信息

docker 容器的历史&#xff1a; 1、Chroot Jail 就是我们常见的 chroot 命令的用法。它在 1979 年的时候就出现了&#xff0c;被认为是最早的容器化技术之一。 它可以把一个进程的文件系统隔离起来。 2、The FreeBSD Jail Freebsd Jail 实现了操作系统级别的虚拟化&#…

csapp 读书笔记

第二章&#xff1a;信息的表示和处理 历史上因程序bug导致重大事故的情况很多是由数字溢出&#xff0c;缓冲区溢出导致的。 本章主要讲的是基本数据类型的(IEEE)表示&#xff0c;大小端&#xff0c;以及二进制位运算的骚操作案例。 第三章&#xff1a;程序的机器级表示 本章…

名窑讲坛:钧瓷“神、奇、妙、绝”四大特色之“妙”——纹路

文/倾灵叶 钧瓷以“入窑一色&#xff0c;出窑万彩”的神奇窑变著称于世。 钧瓷的纹路是经自然窑变形成的具有自身典型艺术特征釉面装饰&#xff0c;是特殊的釉料和独特的烧成工艺的产物&#xff0c;与其他窑系陶瓷作品人工雕刻、压刻和绘制而成的纹饰存在着本质的不同&#xf…

12家硬件厂商发布飞桨生态发行版 软硬一体协同发展

11月30日&#xff0c;由深度学习技术及应用国家工程研究中心主办、百度飞桨承办的WAVE SUMMIT2022深度学习开发者峰会如期举行。峰会上&#xff0c;百度AI技术生态总经理马艳军发布了飞桨深度学习平台的最新技术和生态进展&#xff0c;全新发布飞桨开源框架2.4版本&#xff0c;…

Fast Report .NET 2023.1 Crack

Fast Report .NET 适用于 .NET 6、.NET Core、Blazor、ASP.NET、MVC 和 Windows 窗体的全功能报告库。它可以在 Microsoft Visual Studio 2022 和 JetBrains Rider 中使用。 适用于 .NET 6、.NET Core、Blazor、ASP.NET、MVC 和 Windows 窗体的全功能报告库。它可以在 Microso…

计算机毕业论文java毕业设计选题源代码ssm的校园单车自行车租赁系统|租车系统

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 3.2.1技术可行性&#xff1a;技术背景 系统的开发环境和配置都是可以自行安装的&#xff0c;使用比较成熟的开发工具和数据库进行对系统用户…

Highlight_Matching_Pair问题解决

Highlight_Matching_Pair问题解决1 <SNR>20_Highlight_Matching_Pair1.1 提示的问题1.2 出发问题出现的条件1.2.1 访问到“&#xff08;&#xff09;”时会出现1.2.1 访问到不成对的“{}”时会出现2 解决办法2.1 首先确认matchparen.vim是否最新2.2 将vim更新到最新的版本…

数据结构—查找方法改进流程

文章目录哈希表哈希表 >红黑树—1—> 哈希表缺点—2—> 二维数组—3—> 数组加链表—4—> 树—5—> 有序二叉树—6—> 平衡二叉树—7—> 多叉树—8—> 红黑树红黑树的特点红黑树和链表的选择———————————————————————————…

ansible的主机清单和Playbook(剧本)

一、inventory---主机清单 1.1 支持对主机分组&#xff0c;每个组内可以定义多个主机&#xff0c;可以把一台主机分别放在两个组内。 把.10到.100的主机全部放在这个组里面&#xff08;/etc/ansible/hosts:配置文件&#xff09; 有的主机不是以ip地址放在主机清单里的&#x…

企业实施SRM系统应该避开哪些误区?

近年来&#xff0c;SRM供应商协同管理系统逐渐在各行各业中得到广泛运用&#xff0c;许多企业在SRM选型时投入了大量的时间、资源和精力&#xff0c;但系统上线后的效果却并不理想。SRM选型时常见的误区主要有以下几种&#xff1a; 误区一&#xff1a;头痛医头脚痛医脚&#x…