最近在做手寫體識別,需要將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...