цветовая карта отличается при использовании cv2.imshow и drawpixmap в PyQt5.

В настоящее время мне нужно показать мое серое изображение в псевдоцвете. Я использую opencv2 для создания псевдоцветовой карты. Однако я считаю, что цветовая карта, показанная в cv2 и QLabel, отличается.

Для cv2 код:

import numpy as np
import cv2

img = np.zeros((256,256),dtype=np.uint8)
img[0:128,0:128] = 255
img[128:255,128:255] = 128
disImg = cv2.applyColorMap(img, cv2.COLORMAP_AUTUMN)
cv2.imshow('test',disImg)
cv2.waitKey()

И результат:

введите здесь описание изображения

Затем я использую ту же цветовую карту для создания псевдоцветного изображения и отображения с помощью drawpixmal, код такой:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import numpy as np
import cv2
class MyLabel(QLabel):
    def __init__(self):
        super(MyLabel, self).__init__()
        img = np.zeros((256,256),dtype=np.uint8)
        img[0:128,0:128] = 255
        img[128:255,128:255] = 128
        disImg = cv2.applyColorMap(img, cv2.COLORMAP_AUTUMN)
        QImg = QImage(disImg.data, disImg.shape[1], disImg.shape[0], disImg.strides[0], QImage.Format_RGB888)
        self.qimg = QImg

    def paintEvent(self, QPaintEvent):
        super(MyLabel, self).paintEvent(QPaintEvent)

        pos = QPoint(0, 0)
        source = QRect(0, 0, 256,256)

        painter = QPainter(self)
        painter.drawPixmap(pos, QPixmap.fromImage(self.qimg), source)

class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        layout = QHBoxLayout(self)
        self.resize(300,300)
        self.label = MyLabel()
        layout.addWidget(self.label)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

И в результате:

введите здесь описание изображения

Почему цветовая карта отличается, когда я показываю одно и то же изображение?

Кроме того, cv2.COLORMAP_AUTUMN должен быть: введите здесь описание изображения

Итак, изображение, показанное cv2, правильное, а python drawpixmap дает неправильное отображение.

Как это исправить?


person Qiang Zhang    schedule 31.05.2018    source источник
comment
не читал текст, но, вероятно, это BGR против RGB, поскольку opencv использует bgr, а qt использует rgb для рендеринга. Преобразовать в RGB.   -  person Micka    schedule 31.05.2018


Ответы (1)


Благодаря Micka, opencv использует BGR, а qt использует RGB для рендеринга. Итак, правильный код должен быть:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import numpy as np
import cv2
class MyLabel(QLabel):
    def __init__(self):
        super(MyLabel, self).__init__()
        img = np.zeros((256,256),dtype=np.uint8)
        img[0:128,0:128] = 255
        img[128:255,128:255] = 128
        disImg = cv2.applyColorMap(img, cv2.COLORMAP_AUTUMN)
        b = disImg[:,:,0]
        g = disImg[:,:,1]
        r = disImg[:,:,2]

        img = np.zeros((256,256,3),dtype=np.uint8)
        img[:,:,0] = r
        img[:,:,1] = g
        img[:,:,2] = b
        disImg = img


        QImg = QImage(disImg.data, disImg.shape[1], disImg.shape[0], disImg.strides[0], QImage.Format_RGB888)
        self.qimg = QImg

    def paintEvent(self, QPaintEvent):
        super(MyLabel, self).paintEvent(QPaintEvent)

        pos = QPoint(0, 0)
        source = QRect(0, 0, 256,256)

        painter = QPainter(self)
        painter.drawPixmap(pos, QPixmap.fromImage(self.qimg), source)

class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        layout = QHBoxLayout(self)
        self.resize(300,300)
        self.label = MyLabel()
        layout.addWidget(self.label)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
person Qiang Zhang    schedule 31.05.2018