0


【Python】转换图片分辨率resize,不改变宽高比,不损失图像信息,OpenCV,计算机视觉

  1. import os
  2. import cv2
  3. from tqdm import tqdm
  4. # 设定默认图像高度和宽度
  5. height = 640
  6. width = 480
  7. # 定义调整图像大小并保存的函数
  8. def resize_and_save(srcImgDir, dstImgDir, height=height, width=width):
  9. # 如果目标图像文件夹不存在,则创建它
  10. if not os.path.exists(dstImgDir):
  11. os.makedirs(dstImgDir)
  12. # 获取源图像文件夹中以'.jpg'结尾的图像文件名列表
  13. imgNames = [img for img in os.listdir(srcImgDir) if img[-4:] == '.jpg']
  14. # 如果找到图像文件,则创建图像文件路径列表
  15. if imgNames:
  16. imgsList = [os.path.join(srcImgDir, i) for i in imgNames]
  17. else:
  18. return 0
  19. # 遍历图像文件路径列表
  20. for i, imgPath in tqdm(enumerate(imgsList)):
  21. # 获取输出图像文件的完整路径
  22. dstName = os.path.join(dstImgDir, imgNames[i])
  23. # 读取图像文件
  24. image = cv2.imread(imgPath)
  25. # 获取图像的高度、宽度和通道数
  26. h, w, c = image.shape
  27. # 初始化上、下、左、右的边框大小
  28. top, bottom, left, right = (0, 0, 0, 0)
  29. # 断言图像的高度和宽度大于等于指定的高度和宽度
  30. assert h >= height and w >= width, 'ratio should be less than 1'
  31. # 计算图像长边的缩放比例
  32. long_side = max(h, w)
  33. if h >= w:
  34. ratio = float(height) / long_side
  35. elif h < w:
  36. ratio = float(width) / long_side
  37. # 调整图像的长边并在短边两侧添加黑色边框
  38. resi = cv2.resize(image, (0, 0), fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
  39. # 获取调整后的图像的高度、宽度和通道数
  40. res_height, res_width, res_c = resi.shape
  41. # 根据图像的长边与短边的关系,计算边框大小
  42. if h >= w:
  43. if res_width < width:
  44. dw = width - res_width
  45. left = dw // 2
  46. right = dw - left
  47. elif h < w:
  48. if res_height < height:
  49. dh = height - res_height
  50. top = dh // 2
  51. bottom = dh - top
  52. # 定义黑色边框的像素值
  53. BLACK = [0, 0, 0]
  54. # 在图像上下左右添加黑色边框
  55. res = cv2.copyMakeBorder(resi, top, bottom, left, right, cv2.BORDER_CONSTANT, value=BLACK)
  56. # 将调整后的图像保存到输出路径
  57. cv2.imwrite(dstName, res)
  58. # 打印图像调整前后的形状信息
  59. print(image.shape, '->', resi.shape, '->', res.shape)
  60. if __name__ == '__main__':
  61. # 指定输入图像文件夹和输出图像文件夹
  62. imgDir1 = 'input'
  63. imgDir2 = 'output'
  64. # 调用图像大小调整函数
  65. resize_and_save(imgDir1, imgDir2)

首先,定义了默认的图像高度和宽度。然后,通过resize_and_save函数实现图像大小调整和保存的功能。函数接收输入图像文件夹路径和输出图像文件夹路径,以及可选的高度和宽度参数。

在函数内部,首先判断输出图像文件夹是否存在,若不存在则创建。然后,获取输入图像文件夹中所有以'.jpg'结尾的图像文件名,并创建图像文件路径列表。如果找不到符合条件的图像文件,则返回0。

接下来,遍历图像文件路径列表,依次对每个图像进行处理。读取图像文件,并获取图像的高度、宽度和通道数。然后,根据图像的长边与指定的高度和宽度进行比较,计算调整比例。

接着,使用OpenCV的resize函数将图像按照比例调整大小。根据调整后的图像和目标高度和宽度之间的关系,计算需要添加的边框大小。

定义了黑色边框的像素值,并使用OpenCV的copyMakeBorder函数在图像上下左右添加黑色边框。

最后,使用OpenCV的imwrite函数将调整后的图像保存到输出图像文件夹中,并打印出图像调整前后的形状信息。

在主函数中,指定了输入图像文件夹和输出图像文件夹的路径,并调用resize_and_save函数进行图像大小调整和保存的操作。

效果如下

51405140图片转换为640480图片


本文转载自: https://blog.csdn.net/dsafefvf/article/details/130644800
版权归原作者 范纹杉想快点毕业 所有, 如有侵权,请联系我们删除。

“【Python】转换图片分辨率resize,不改变宽高比,不损失图像信息,OpenCV,计算机视觉”的评论:

还没有评论