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

这篇具有很好参考价值的文章主要介绍了OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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++文章来源地址https://www.toymoban.com/news/detail-481748.html

// 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;

OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)
在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();

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

Python

C++

到了这里,关于OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图像语义分割——python滑窗法裁剪数据

    B站:xxx CSDN:python图像分割——滑窗法裁剪数据_百年后封笔-CSDN博客 Github:封笔 公众号:百年后封笔 对图像分割而言,往往给的原图是非常大的,无法直接用于网络训练,因此有必要使用滑窗法进行图像的裁剪,把大图裁剪成一个个小的patch图,如下所示,当然如果有分类

    2024年02月17日
    浏览(70)
  • Opencv C++ SIFT特征提取(单图像,多图像)+如何设置阈值+如何对文件夹进行批处理+如何设置掩膜裁剪影像

    SIFT(Scale-Invariant Feature Transform)是一种用于图像处理和计算机视觉的特征提取算法。由David Lowe于1999年首次提出,它是一种非常有效的局部特征描述符,具有尺度不变性、旋转不变性和对部分遮挡的鲁棒性。 SIFT特征提取的主要步骤包括: 尺度空间极值检测(Scale-Space Extrem

    2024年01月19日
    浏览(45)
  • 使用python_opencv比较图像差异/使用python_opencv找出两张图像的差异范围

    目录 1 创建conda环境 2 安装python库  2.1 报错 ModuleNotFoundError: No module named \\\'numpy\\\' 3 image_diff.py

    2024年02月05日
    浏览(44)
  • 基于 Opencv python实现批量图片去黑边—裁剪—压缩软件

    批量处理图片文件,批量提取GIF图片中的每一帧,具有范围裁剪、自动去除黑/白边、调整大小、压缩体积等功能。 先看一些软件的界面,是基于Tkinter写的GUI 裁剪等功能基于Opencv     我添加了处理GIF的github:  原作者的github:hiroi-sora/Umi-CUT: 图片批量去黑边/裁剪/压缩工具,

    2024年02月15日
    浏览(44)
  • python opencv:批量识别拼接图片分界线并进行自动裁剪

    在网上找图片素材时,有很多的图片是长图片,在一张图片上拼接了许多张图片,而很多时候我们需要单张图片,此时就需要将长图进行裁剪,一般可以用图片工具进行简单裁剪,高级点可以采用ps进行切片处理,如果图片数量少还好说一旦有大量的图片需要裁剪就很繁琐并

    2024年02月11日
    浏览(53)
  • 使用OpenCV对旋转矩形区域的内容进行裁剪

    再做OCR的时候,我想单独把矩形的区域裁剪出来,因此对这个问题进行了一些探索,最后得到的具体步骤如下: 使用cv2.minAreaRect()函数获取旋转矩形的中心点、宽度、高度和旋转角度信息。 使用cv2.getRotationMatrix2D()函数获取旋转矩阵。 使用cv2.warpAffine()函数根据旋转矩阵进行旋

    2024年02月15日
    浏览(43)
  • Python|OpenCV-基本使用和图像处理(1)

    前言 本文是该专栏的第1篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 OpenCV是基于开源许可的跨平台计算机 视觉库 ,起初OpenCV是由Intel公司开发的,直到后面由非营利组织进行维护。提到OpenCV,就不得不说它提供了大量的图像和视频处理函数,使得计算机视觉

    2024年02月12日
    浏览(60)
  • 使用OpenCV实现图像超分辨率(Python)

    超分辨率技术指的是将低分辨率的图像或视频通过算法转换成高分辨率的图像或视频的操作。 超分辨率可以分为两种:单图像超分辨率(Single Image Super Resolution,SISR)和视频超分辨率(Video Super Resolution,VSR)。 OpenCV中的超分辨率功能被集中在了contrib模块中,因此我们首先需

    2024年02月13日
    浏览(48)
  • “探索图像处理的奥秘:使用Python和OpenCV进行图像和视频处理“

     1、上传图片移除背景后下载。在线抠图软件_图片去除背景 | remove.bg – remove.bg 2、对下载的图片放大2倍。ClipDrop - Image upscaler  3、对放大后的下载照片进行编辑。  4、使用deepfacelive进行换脸。 1)将第三步的照片复制到指定文件夹。C:myAppdeepfakelivetempDeepFaceLive_NVIDIAuserda

    2024年02月16日
    浏览(96)
  • 在 Python 中使用 OpenCV 通过透视校正转换图像

    在计算机视觉和图像处理领域,透视变换是一个强大的工具。它允许我们改变图像的视角以获得新的视点,通常用于校正扭曲或模拟不同的相机角度。本文将探讨一个 Python 脚本,该脚本使用计算机视觉领域流行的 OpenCV 库对图像执行透视变换。我们将详细介绍该脚本的工作原

    2024年01月25日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包