图像分块显示异常求助:1600×872图像分割为4块后最后一块内容缺失
我来帮你排查下代码里的问题,你遇到最后一块显示不全的情况,主要是因为切片逻辑、循环控制还有对OpenCV图像维度的理解都出了点小差错:
问题拆解
OpenCV图像维度搞反了
OpenCV加载的图像数组形状是(height, width, channels)——也就是先高度(行)后宽度(列),但你的代码里用oriImg[initialw:widthDiv, initialh:heightDiv],把宽度和高度的切片顺序搞反了,导致截取的区域完全不对。循环与坐标更新逻辑彻底混乱
- 手动修改循环变量
i=i+1会直接破坏for循环的迭代机制,导致循环次数失控; initialw = initialw + initialw这种写法,第一次更新后还是0,根本没移动起始坐标,后续切片始终从左上角开始;widthDiv = widthDiv + widthDiv1会让结束坐标直接翻倍,很快超过图像实际尺寸,最后一块的切片范围自然会超出图像边界,显示不全甚至是空的。
- 手动修改循环变量
分割块数与尺寸不匹配
你要分4块,但代码里按width/4和height/4计算单块尺寸,这其实是要分16块(4×4),和你设定的n=4完全矛盾,逻辑根本不统一。
修正后的代码
假设你想把1600×872的图像分成2行×2列的4块(最常见的4分法),以下是修正后的可运行代码:
import cv2 import numpy as np # 替换成你的图像路径 oriImg = cv2.imread("your_image_file.jpg") height, width = oriImg.shape[:2] total_blocks = 4 # 总块数 cols = 2 # 列数,2列×2行=4块 rows = 2 # 行数 # 计算每块的宽度和高度 block_width = width // cols block_height = height // rows arr = [] block_index = 0 # 遍历行和列来分割图像 for row in range(rows): for col in range(cols): # 计算当前块的起始/结束坐标(注意OpenCV的维度顺序:y轴在前,x轴在后) y_start = row * block_height y_end = y_start + block_height x_start = col * block_width x_end = x_start + block_width # 截取当前块 current_block = oriImg[y_start:y_end, x_start:x_end] arr.append(current_block) # 显示当前块,按任意键切换到下一块 cv2.imshow(f"Part {block_index}", current_block) cv2.waitKey(0) block_index += 1 # 关闭所有窗口 cv2.destroyAllWindows()
代码说明
- 用
cols和rows明确4块的布局(2×2),避免逻辑混乱; - 严格遵循OpenCV的图像维度顺序,切片时先指定高度范围(y轴),再指定宽度范围(x轴);
- 坐标更新逻辑清晰:每行每列的起始坐标都是
索引×单块尺寸,结束坐标是起始坐标加单块尺寸,绝对不会超出图像边界; - 移除了手动修改循环变量的错误写法,用
block_index单独计数块的序号,避免干扰循环迭代。
如果你的需求是把图像分成1行×4列的横向4块,只需要把cols=4,rows=1,其他代码不变即可——这样每块的宽度是1600//4=400,高度是872,刚好适配你的图像尺寸。
内容的提问来源于stack exchange,提问作者user18386987
相关产品推荐
相关产品推荐

