PyQt5-QImage、QPixmap、Opencv与QLabel、Matplotlib的互动


前言

早期进行图像旋转用的笨方法是:

  1. cv2.imread()读取图像
  2. numpy旋转图像
  3. 将旋转后的图像保存cv2.imwrite()并且从新读取图像

由于图像基本操作我是个小白,什么都没有接触过。因此,前期的想法就是这样,这种方法简单,明了,但是缺点你懂的

后来,偶尔看到了这篇文章:【PyQt5】显示多张图片并支持滚动,其中的一行代码:label.setScaledContents(True) 自适应窗口控件大小,于是就在网上搜集各种资料,并且自己测试,最终总结为该篇博客。

这里基本汇聚了简单的图像处理+图像界面设计用到的基本格式转换,希望可以帮助到你!


一、转换

  • 测试图像
    在这里插入图片描述
    在这里插入图片描述
  • path、photo
path = r'F:\python\gradu_design\gra_des\compr\bamarket115.jpg'
# r'F:\python\gradu_design\gra_des\imges\logo1_1.jpg'

# 调用
photo = QImage(path)
# print('photo type:', type(photo), photo.width(), photo.height())

下面方法涉及到的参数photopath来源于此

  • 显示问题

下面方法会看到两张在一起对比的图片:这是单独使用matplotlib显示查看转换的效果:
matplotlib是显示RGB图片的,由于测试图片是红色的,因此若结果显示蓝色,则证明图片是BGR格式的,反之若和原图一样则是RGB个格式

# image 类型必须为<class 'numpy.ndarray'>,plt才可以显示
def plt_show(self,image):
    plt.subplot(121)
    plt.title('格式检查-BGR')
    plt.imshow(image)

    plt.subplot(122)
    plt.title('格式检查-RGB')
    plt.imshow(image[:,:,::-1])  # 正常显示

    plt.show()

1.1 Opencv_to_QPixmap

完整过程:Opencv -> QImage -> QPixmap

  • 代码
# 调用  cv2 读取图像 -> QPixmap 让QLabel显示
self.cvread_labelshow(pic_show_label=self.label,path=path)

# cv2 读取图像 -> QPixmap 让QLabel显示
def Opencv_to_QPixmap(self,pic_show_label,path):
    print('-----cvread_labelshow-----')
    
    # 图片路径
    img_path = path
    
    # 通过cv读取图片  BGR格式
    img = cv2.imread(img_path)
    print('cv2 : ',type(img))# cv2 :  <class 'numpy.ndarray'>
    plt.subplot(121)
    plt.title('BGR-格式')
    plt.imshow(img)  # img本来是BGR格式,通过img[:,:,::-1]转为RGB格式

    # 通道转化  BGR->RGB
    RGBImg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.subplot(122)
    plt.title('RGB-格式')
    plt.imshow(RGBImg)  # matplotlib只能显示RGB图像
    plt.show() 
    
    # 将图片转化成Qt可读格式   QImage
    qimage = QImage(RGBImg, RGBImg.shape[1], RGBImg.shape[0], QImage.Format_RGB888)
    print('qimage type:', type(qimage))
    piximage = QPixmap(qimage)
    print('piximage type:', type(piximage))
    
    # 显示图片
    pic_show_label.setPixmap(piximage)
    pic_show_label.setScaledContents(True)
    print('pic_show_label mess:',pic_show_label.width(), pic_show_label.height())
    print('piximage mess:',piximage.width(),piximage.height(
  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胜天半月子

打不打商的无所谓,能帮到你就好

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

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

打赏作者

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

抵扣说明:

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

余额充值