将图像分成两等份python opencv

Posted

技术标签:

【中文标题】将图像分成两等份python opencv【英文标题】:divide image into two equal parts python opencv 【发布时间】:2017-06-26 12:23:25 【问题描述】:

谁能告诉我如何将图像分成上下两部分?这样我就可以重叠它们。例如,我有一个图像,我应该将它划分为计算每个部分的像素数。我是 OpenCV 新手,并不完全了解图像的几何形状。

【问题讨论】:

您能否详细说明“水平分割图像的轮廓”? 请阅读How to Ask 【参考方案1】:

为了简化@avereux 的回答:

在 Python 中,您可以使用拼接将图像分解为子图像。其语法是:

sub_image = full_image[y_start: y_end, x_start:x_end]

请注意,对于图像,原点是图像的左上角。所以图像第一行(即最顶行)上的像素将具有坐标 x_coordinate = x, y_coordinate = 0

要获取图像的形状,请使用image.shape。这将返回(no_of_rows, no_of_cols)

您可以使用它们以任何您想要的方式分解图像。

【讨论】:

【参考方案2】:

您可以从中间水平裁剪图像的顶部和底部。

打开图片。

import cv2
import numpy as np
image = cv2.imread('images/blobs1.png')
cv2.imshow("Original Image", image)
cv2.waitKey(0) 

使用image.shape 让我们捕获高度和宽度变量。

height, width = image.shape[:2]
print image.shape

现在我们可以开始裁剪了。

# Let's get the starting pixel coordiantes (top left of cropped top)
start_row, start_col = int(0), int(0)
# Let's get the ending pixel coordinates (bottom right of cropped top)
end_row, end_col = int(height * .5), int(width)
cropped_top = image[start_row:end_row , start_col:end_col]
print start_row, end_row 
print start_col, end_col

cv2.imshow("Cropped Top", cropped_top) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

# Let's get the starting pixel coordiantes (top left of cropped bottom)
start_row, start_col = int(height * .5), int(0)
# Let's get the ending pixel coordinates (bottom right of cropped bottom)
end_row, end_col = int(height), int(width)
cropped_bot = image[start_row:end_row , start_col:end_col]
print start_row, end_row 
print start_col, end_col

cv2.imshow("Cropped Bot", cropped_bot) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

最后,我们可以使用image.size 来给出每个部分的像素数。

cropped_top.size
cropped_bot.size

你可以对轮廓做同样的事情,但它会涉及到边界框。

【讨论】:

【参考方案3】:

这是一种更灵活的方法,您可以将图像切成两半或分成 4 个相等的部分或 6 个部分,无论您需要多少部分。

此代码将首先将图像水平裁剪为 2 块 然后对于这 2 块中的每一个,它将裁剪另外 3 个图像 留下总共 6 张裁剪的图像 更改 CROP_W_SIZE 和 CROP_H_SIZE 值以调整裁剪设置。 您将需要一个 CROP 文件夹,此代码将在其中保存图像。

import cv2,time

img = cv2.imread('image.png')
img2 = img

height, width, channels = img.shape
# Number of pieces Horizontally 
CROP_W_SIZE  = 3 
# Number of pieces Vertically to each Horizontal  
CROP_H_SIZE = 2 

for ih in range(CROP_H_SIZE ):
    for iw in range(CROP_W_SIZE ):

        x = width/CROP_W_SIZE * iw 
        y = height/CROP_H_SIZE * ih
        h = (height / CROP_H_SIZE)
        w = (width / CROP_W_SIZE )
        print(x,y,h,w)
        img = img[y:y+h, x:x+w]



        NAME = str(time.time()) 
        cv2.imwrite("CROP/" + str(time.time()) +  ".png",img)
        img = img2

【讨论】:

index 应该类型转换为 int 否则它将失败。 img = img[y:y+h, x:x+w] 应该类似于 img = img[int(y):int(y+h), int(x):int(x+w)] 【参考方案4】:

检查一下这两个左右和自下而上的划分:

import cv2
  
img = cv2.imread('img.jpg')
  
h, w, channels = img.shape
  

左右分割:

half = w//2
      
 
left_part = img[:, :half]           
      
right_part = img[:, half:]  
      
cv2.imshow('Left part', left_part)
cv2.imshow('Right part', right_part)
  

上下划分:

half2 = h//2
          
top = img[:half2, :]
bottom = img[half2:, :]
          
cv2.imshow('Top', top)
cv2.imshow('Bottom', bottom)

我编辑了一点这个来源:https://www.geeksforgeeks.org/dividing-images-into-equal-parts-using-opencv-in-python/

【讨论】:

以上是关于将图像分成两等份python opencv的主要内容,如果未能解决你的问题,请参考以下文章

将列表中的数字分成 K 等份

列表分成N等份

为啥复合辛普森公式分成2n等份

如何使用php将数组分成两个相等的部分

将pdf分成两部分

在 Python 中通过多个分隔符将一列分成两列