Pyside2中Qlabel显示 单通道/二值 图片数据乱码问题解决

Pyside2中Qlabel显示 单通道/二值 图片数据乱码问题解决

  • 配置环境
  • 1. 问题描述
  • 2.问题解决
    • 2.1网上查询资料
    • 2.2本文解决方案

配置环境

使用环境:python3.8
平台:Windows10
IDE:PyCharm

1. 问题描述

博主在编写GUI时需要显示单通道图片,采用的方法是通过Qlabel完成此功能,在此前,显示彩色图像通过Qlabel来做是没问题的,如图所示
Pyside2中Qlabel显示 单通道/二值 图片数据乱码问题解决_第1张图片
但是细心观察会发现,二值化上面的黑白图片是存在乱码的
先附上显示图像的代码:

	import cv2 as cv
	import numpy as np
	from PySide2.QtGui import QPixmap, QImage
	
	# GUI上显示彩色图像
    imgResult = cv.cvtColor(imgResult, cv.COLOR_BGR2RGB)
    imgResult = img_resize(imgResult,(80,80))
    show_imgResult = QImage(imgResult.data, imgResult.shape[1], imgResult.shape[0], QImage.Format_RGB888)
    pix_img = QPixmap.fromImage(show_imgResult)
    ui.label_Cut.setPixmap(pix_img)
    
    # GUI上显示二值图像
    bw = img_resize(bw, (80, 80))
    show_bw  = QImage(bw .data, bw .shape[1], bw .shape[0], QImage.Format_RGB888)
    pix_img = QPixmap.fromImage(show_bw )
    ui.label_bw.setPixmap(pix_img)

其中
imgResult为之前获取到的彩色图像,ui.label_Cut为GUI上Qlabel的控件
bw为之前获取到的二值(单通道)图像,ui.label_bw为GUI上Qlabel的控件

2.问题解决

可以发现,彩色图像和二值图像采用的显示方法是一模一样的,但是彩色没问题,二值存在了问题。

2.1网上查询资料

在网上查询诸多资料,并没有发现有比较好的解决方案,网上描述的比较多的是关于读取PNG格式图片,在Qlabel中显示不了,采用的方法是将PNG图片通过软件paint3d转换后再读入来解决问题。但是针对此处肯定是不适用的。

2.2本文解决方案

二值图片显示不了,彩色能显示,应该是Qt对二值图像显示不兼容,解决Qt的问题比较困难,采用另一种思路,解决图片的问题,将二值图片转变为三通道图片不就行了,但是图片显示出来的颜色不能改变,所幸OpenCV中有这个函数:

bw = cv.cvtColor(bw, cv.COLOR_GRAY2BGR)

所以,在显示黑白图片的代码中添加这段代码就可实现,完整代码如下:

	import cv2 as cv
	import numpy as np
	from PySide2.QtGui import QPixmap, QImage
	
	# GUI上显示彩色图像
    imgResult = cv.cvtColor(imgResult, cv.COLOR_BGR2RGB)
    imgResult = img_resize(imgResult,(80,80))
    show_imgResult = QImage(imgResult.data, imgResult.shape[1], imgResult.shape[0], QImage.Format_RGB888)
    pix_img = QPixmap.fromImage(show_imgResult)
    ui.label_Cut.setPixmap(pix_img)
    
    # GUI上显示二值图像
    bw = img_resize(bw, (80, 80))
    # 二值图片转三通道彩色图片
    bw = cv.cvtColor(bw, cv.COLOR_GRAY2BGR)		
    show_bw  = QImage(bw .data, bw .shape[1], bw .shape[0], QImage.Format_RGB888)
    pix_img = QPixmap.fromImage(show_bw )
    ui.label_bw.setPixmap(pix_img)

效果如下;
Pyside2中Qlabel显示 单通道/二值 图片数据乱码问题解决_第2张图片

你可能感兴趣的:(Pyside2,pyside2,Qt,单通道图片,Qlabel,乱码)