將QImage轉換為numpy array

2021-10-03 06:39:42 字數 1735 閱讀 1075

最近在做手寫體識別,需要將qt中手寫的數字轉換成像訓練集一樣。因此需要將qimage轉換為numpy array。

筆者使用的是pyqt,但是對qt和python之間資料之間的轉換不太熟悉。查了很長時間,也沒有找到詳細的說明,最後在stackoverflow中查到了轉換方法,但是說的也不清楚。

終於,經過查閱qt的參考手冊終於明白了轉換過程。

from pil import image

import numpy as np

import matplotlib.pyplot as plt

image = self.canvas_label.canvas.toimage(

)size = image.size(

)s = image.bits(

).asstring(size.width(

)* size.height(

)* image.depth()//

8)# format 0xffrrggbb

arr = np.fromstring(s, dtype=np.uint8)

.reshape(

(size.height(

), size.width(

), image.depth()//

8))new_image = image.fromarray(array)

# convert to gray

new_image.convert(

"l")

new_image.thumbnail((28

,28))

plt.imshow(new_image, cmap=

'gray'

)plt.show(

)

筆者的原圖是通過qpixmap繪製的一幅rgb圖。之後將其轉換為qimage。

通過s = image.bits().asstring(size.width() * size.height() * image.depth() // 8)將影象資料轉換成字串。

引數是影象中位元組數,位元組數等於影象寬度 × 影象高度 × 通道數,即byt

es=w

idth

∗hei

ght∗

chan

nels

bytes = width * height * channels

bytes=

widt

h∗he

ight

∗cha

nnel

s 需要注意的是通道數,檢視qt的手冊知道qt的rgb影象的格式是0xffrrggbb,其實就是將alpha通道全部置為了0xff。

之前以為只有3個通道,所以一直有問題。qimage.depth()可以返回影象深度的位元數,對於rgb圖qimage.depth()返回值為32,所以整除8之後就是通道數。

之後使用np.fromstring()即可通過字串構造numpy array。

到這裡qimage轉換為numpy array的任務就完成了。之後需要將原圖進行灰度處理和壓縮。

使用image.convert()可以進行格式轉換,詳細用法見

使用image.thumbnail()進行壓縮,注意該方法只能進行壓縮,不能放大,而且是等比例壓縮。如果需要放大可以使用image.resize()方法。

將文字記錄轉換為NumPy的解析程式

datingtestset2.txt檔案中每行有4個資料,前三個為物件特徵值,第四個為物件標籤。將txt資料轉換為numpy陣列,將特徵值與標籤分離。為 def file2matrix filename fr open filename arrayolines fr.readlines 讀入所有行 ...

mysql將毫秒轉換為小時 將毫秒轉換為天小時分鐘

今天在專案中遇到進行計算流程單從開始到結束所花費的時間,樣式是xx天xx小時xx秒,有天顯示天,沒有就不顯示 獻上 package com.project.model.work public class dateformat 將毫秒轉化為天時分秒毫秒 public static string for...

將QString轉換為char

官方說明 注意在呼叫qbytearray.data 之前,必須要先顯示儲存這個bytearray。像這樣const char c str2 str2.tolatin1 data 會使程式崩潰,因為qbytearray沒有被儲存,呼叫data 前是不存在的,必須先顯式呼叫一次tolatin1 再呼叫d...