Pyqt5解决图片放置在Label上的比例问题

在Pyqt5项目中,为了解决1000x1000的Label显示4000x800长条型图片导致的比例失真问题,作者采用了先填充再等比缩放的方法。通过使用opencv的copyMakeBorder函数使图片变为正方形,然后根据Label尺寸等比缩放至1000x1000,保持图像不失真,以适应瑕疵识别的需求。
摘要由CSDN通过智能技术生成

Pyqt5解决图片放置在Label上的比例问题


这两天在做一个pyqt5的项目,遇到了一个小问题:在主界面有一个1000 x 1000 大小的Label标签用来放置图像,对其进行瑕疵识别。但是这个图像是长条型的,shape为 4000 x 800,放置在Label上比例会失调,导致图片的失真。

问题1:之前测试用的数据是4000 x 4000 shape的,放置在Label上时,可以采用

self.label.setScaledContents(True)
使得图片自适应Label的大小,让其变成1000 x 1000像素大小。因为是等比缩放,所以图像并不会失真。但是这次的数据比例是那种长条型,如果用上面的代码进行自适应,短边方向会被拉伸,导致图像失真,识别效果很不理想。

解决方法:首先对其进行填充,使其成为正方形的shape

    def pic_adaptive_label_scale(self, view_image, label, resize=False, is_show=True):
        # 图片自适应label比例大小
        image_copy = None
        try:
            view_image = cv2.cvtColor(view_image, cv2.COLOR_RGB2BGR)
            height, width = view_image.shape[:2]  ##获取图片宽度
            if width > height:
                h_diff = abs(width - height) // 2
                top, bottom, left, right = h_diff, h_diff, 0, 0
            else:
                w_diff = abs(height - width) // 2
                top, bottom, left, right = 0, 0, w_diff, w_diff
            image_copy = cv2.copyMakeBorder(view_image, top, bottom, left, right, cv2.BORDER_CONSTANT,
                                            value=[0, 0, 0])

            if resize:
                new_width, new_height = label.width(), label.height()
                image_copy = cv2.resize(image_copy, (int(new_width), int(new_height)), interpolation=cv2.INTER_AREA)
        except Exception as e:
            logger.info(e)

        if is_show and image_copy is not None:
            label.setPixmap(
                QPixmap.fromImage(
                    QImage(image_copy.data, image_copy.shape[1], image_copy.shape[0], QImage.Format_RGB888)))
        return image_copy


这里,我先获取其宽高,为4080x808大小,获取差值,然后对左右进行填充(黑色)

然后得到的应该是一个正方形大小(4080 x 4080)

接着不采用自适应Label,我直接修改图像尺寸,等比缩放到1000 x 1000大小

这样图像就可以完整的显示在Label上了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值