opencv 等比例缩放/获取像素点/左右等比例填充

文章介绍了如何使用Python的PIL库对图片进行等比例缩放,避免拉伸,然后在宽度方向上填充像素以适应目标尺寸。通过resize_image函数实现缩放,get_pixel_value获取像素值,最后add_horizontal_border函数添加水平边界填充。代码示例展示了如何处理图片以适应1920*1080的分辨率。
摘要由CSDN通过智能技术生成

1. 前言

         在处理图片的时候,总是碰到图片缩放拉伸了,但是等比例缩放,又想填充一下其他边界的像素,所以整理了一下代码,希望有点帮助

2. 图片等比例缩放

          原图的shape是532*630,但是想修改shape成1920*1080,直接用resize肯定会拉伸,感觉怪怪的,这里先等比例缩放,但是缩放后像素是883*1080,那看看边界的像素值,然后左右填充好了

           原图:

 修改后的图片: 

from PIL import Image, ImageOps



def resize_image(input_image_path, output_image_path, size):
    """
    改变图片分辨率,保持比例不变
    :param input_image_path: 输入图片路径
    :param output_image_path: 输出图片路径
    :param size: 输出图片分辨率,格式为元组(宽度,高度)
    """
    # 打开原始图片
    with Image.open(input_image_path) as image:
        # 计算输出图片分辨率的比例
        width, height = image.size
        ratio = min(size[0] / width, size[1] / height)
        new_width = int(width * ratio)
        new_height = int(height * ratio)
        # 调整图片分辨率
        image = image.resize((new_width, new_height))
        # 创建输出图片
        image.save(output_image_path)
resize_image("test.png", "test_change.png", (1920, 1080))

 3.获取像素值

         查看test_change.png的(10,10)像素值是(189, 189, 189, 255)

from PIL import Image, ImageOps


def get_pixel_value(image_path, x, y):
    """
    获取图片指定位置的像素值
    :param image_path: 图片路径
    :param x: 横坐标
    :param y: 纵坐标
    :return: 像素值,格式为 RGB 元组
    """
    # 打开图片
    with Image.open(image_path) as image:
        # 获取像素值
        pixel_value = image.getpixel((x, y))
        return pixel_value

pixel_value = get_pixel_value("test_change.png", 10, 10)

4.开始在宽度填充吧

       (1920-883)/2 = 519,好吧,左右边界分别填充519就行了, 小二,上代码!!!

from PIL import Image, ImageOps


def add_horizontal_border(input_image_path, output_image_path, border, color):
    """
    在图片宽度上填充边界
    :param input_image_path: 输入图片路径
    :param output_image_path: 输出图片路径
    :param border: 边界宽度
    :param color: 边界颜色,格式为 RGB 元组
    """
    # 打开原始图片
    with Image.open(input_image_path) as image:
        # 计算输出图片的宽度和高度
        width, height = image.size
        new_width = width + border * 2
        new_height = height
        # 创建新的画布
        new_image = Image.new("RGB", (new_width, new_height), color)
        # 将原始图片绘制在画布上
        new_image.paste(image, (border, 0))
        # 创建输出图片
        new_image.save(output_image_path)

add_horizontal_border("test_change.png", "test_change_1.png", 519, (189, 189, 189, 255))       

test_change.png:

 test_change_1.png:

 好了到此结束了,感觉还要很多的改进方面,这是临时做的一个代码,很多地方可以优化,看闲下来的时候看看优化一下,大家闲用着吧,可以点点关注,或者评论一下。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆珝

您的打赏是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值