標題:Python用字串新增屬性
副標題:Python set attribute by string
今天用pydicom時,需要替Dataset(ds)新增屬性。
程式碼如下:
ds.PixelSpacing=[1, 1]
但是呢,這個專案的規畫人想透過json檔案中的屬性表動態新增屬性,所以需要用字串來新增屬性,該怎麼做呢。
可以將以上程式碼改成:
setattr(ds, 'PixelSpacing', [1,1])
這樣就可以用字串動態新增屬性了。
標題:Python用字串新增屬性
副標題:Python set attribute by string
今天用pydicom時,需要替Dataset(ds)新增屬性。
程式碼如下:
ds.PixelSpacing=[1, 1]
但是呢,這個專案的規畫人想透過json檔案中的屬性表動態新增屬性,所以需要用字串來新增屬性,該怎麼做呢。
可以將以上程式碼改成:
setattr(ds, 'PixelSpacing', [1,1])
這樣就可以用字串動態新增屬性了。
#引入numpy套件
import numpy as np
#將串列轉成ndarray陣列
a=np.array([1,2,3,4,5,6,7,8,9,10,11,12])
#印出陣列的形狀
print(a.shape)
#(12,)
print(a)
#[ 1 2 3 4 5 6 7 8 9 10 11 12]
#將a轉成3*4的二維陣列
a.shape=3,4
#印出a的內容
print(a)
'''
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
'''
#將a轉成2*6的二維陣列
a=a.reshape(2,6)
#印出a的內容
print(a)
'''
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]]
'''
#指定第[0,5]的數字為33
a[0,5]=33
print(a)
'''
[[ 1 2 3 4 5 33]
[ 7 8 9 10 11 12]]
'''
#指定第[1,5]的數字為66
a[1,5]=66
print(a)
'''
[[ 1 2 3 4 5 33]
[ 7 8 9 10 11 66]]
'''
#印出a的最大值、最小值、中位數
print(a.max(),a.min(),np.median(a))
#66 1 7.5
#矩陣運算,將a的所有數字加上5後乘以2
a=(a+5)*2
print(a)
'''
[[ 12 14 16 18 20 76]
[ 24 26 28 30 32 142]]
'''
#印出有哪些數字大於30
print(a>30)
'''
[[False False False False False True]
[False False False False True True]]
'''
#印出大於30的數字
print(a[a>30])
#[ 76 32 142]
#將大於30的數字歸零
a[a>30]=0
print(a)
a=np.sort(a)
print(a)
'''
[[ 0 12 14 16 18 20]
[ 0 0 24 26 28 30]]
'''
#建立0到59,間隔為10的陣列,並指派到b
b=np.arange(0,60,10)
print(b)
#[ 0 10 20 30 40 50]
#將一維陣列改成為二維陣列
b=b.reshape(-1,1)
print(b)
'''
[[ 0]
[10]
[20]
[30]
[40]
[50]]
'''
#將上方的二維陣列加上[0, 1, 2, 3, 4, 5]
b=np.arange(0,60,10).reshape(-1,1)+np.arange(0,6)
print(b)
'''
[[ 0 1 2 3 4 5]
[10 11 12 13 14 15]
[20 21 22 23 24 25]
[30 31 32 33 34 35]
[40 41 42 43 44 45]
[50 51 52 53 54 55]]
'''
#範例:若沒有轉成二維陣列就相加的情況
temp=np.arange(0,60,10)+np.arange(0,6)
print(temp)
#[ 0 11 22 33 44 55]
#選取中間(去除掉外框的部分)
print(b[1:-1,1:-1])
'''
[[11 12 13 14]
[21 22 23 24]
[31 32 33 34]
[41 42 43 44]]
'''
#將中間歸零
b[1:-1,1:-1]=0
print(b)
'''
[[ 0 1 2 3 4 5]
[10 0 0 0 0 15]
[20 0 0 0 0 25]
[30 0 0 0 0 35]
[40 0 0 0 0 45]
[50 51 52 53 54 55]]
'''
#待更新
標題:
args = parser.parse_args報錯:ipykernel_launcher.py: error: unrecognized arguments。
或:
args = parser.parse_args報錯:An exception has occurred, use %tb to see the full traceback.
SystemExit: 2
===分隔線===
今天使用Python的args = parser.parse_args時遇到了以下錯誤:
ipykernel_launcher.py: error: unrecognized arguments
或
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2
如何解決呢?
將 args = parser.parse_args()
改成 args = parser.parse_args(args=[])
改完重新執行程式後,錯誤就消失了。
標題: 用tkinter開視窗選擇要顯示的圖片及檔名。
意思就是,可以在tkinter中開選擇視窗選擇要開啟的圖片,然後顯示圖片和檔名出來。
===分隔線===
今天要來使用tkinter顯示圖片和圖片,直接進入正題吧!
首先,載入以下套件:
import cv2
import numpy as np
import tkinter as tk
from PIL import Image, ImageTk
from tkinter import StringVar, IntVar
from tkinter.filedialog import askopenfilename
然後設定一個tkinter視窗,標題為圖片顯示,大小為450*700。
window = tk.Tk()
window.title('圖片顯示')
window.geometry('450x700')
接著定義一個函數:
def OpenFile():
#這是圖片檔的路徑
filename = askopenfilename()
#用cv2載入圖片,我們不用imread,因為它不支援中文。
img = cv2.imdecode(np.fromfile(filename,dtype=np.uint8), cv2.IMREAD_COLOR)
#將cv2的BGR轉成RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#重新調整圖片大小
img=cv2.resize(img,(450,280))
#將img載入為PIL的格式。
im = Image.fromarray(img)
#將img載入到ImageTK中
photo = ImageTk.PhotoImage(im)
#設定labelimg為圖片作顯示(下方會提到)
labelimg.configure(image=photo)
labelimg.image = photo
#設定text1為檔名作顯示(下方會提到)
#filename.split("/")[-1]的意思是,將路徑的/前方砍掉,只留下檔名。
text1.set(filename.split("/")[-1])
接著於函數下方(函數外面)設定tkinter的Button:
b2 = tk.Button(window, text='open', font=('Arial', 12), width=10, height=1, command=OpenFile)
b2.pack()
注意藍色處,意思就是按下去後執行剛剛的OpenFile函數。
設定剛才OpenFile函數中的text1,為顯示檔名的label。
text1 = StringVar()
label1 = tk.Label(window,textvariable=text1, text='1799', font=('Arial', 12), width=100, height=8)
label1.pack()
設定剛才OpenFile函數中的labelimg,它是顯示圖片用的。
labelimg = tk.Label(window, image="")
labelimg.pack()
設定視窗為無限循環(一直保持開啟的狀態直到使用者關閉視窗)
window.mainloop()
由上整理出完整的程式碼如下:
import cv2
import numpy as np
import tkinter as tk
from PIL import Image, ImageTk
from tkinter import StringVar, IntVar
from tkinter.filedialog import askopenfilename
window = tk.Tk()
window.title('圖片顯示')
window.geometry('450x700')
def OpenFile():
#這是圖片檔的路徑
filename = askopenfilename()
#用cv2載入圖片,我們不用imread,因為它不支援中文。
img = cv2.imdecode(np.fromfile(filename,dtype=np.uint8), cv2.IMREAD_COLOR)
#將cv2的BGR轉成RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#重新調整圖片大小
img=cv2.resize(img,(450,280))
#將img載入為PIL的格式。
im = Image.fromarray(img)
#將img載入到ImageTK中
photo = ImageTk.PhotoImage(im)
#設定labelimg為圖片作顯示
labelimg.configure(image=photo)
labelimg.image = photo
#設定text1為檔名作顯示
#filename.split("/")[-1]的意思是,將路徑的/前方砍掉,只留下檔名。
text1.set(filename.split("/")[-1])
b2 = tk.Button(window, text='open', font=('Arial', 12), width=10, height=1, command=OpenFile)
b2.pack()
text1 = StringVar()
label1 = tk.Label(window,textvariable=text1, text='1799', font=('Arial', 12), width=100, height=8)
label1.pack()
labelimg = tk.Label(window, image="")
labelimg.pack()
window.mainloop()
現在來執行一次程式看看吧!
按下執行,可以看到一個視窗,有個按鈕。
我們選擇的當然是頁面上唯一的一張立華奏彈鋼琴圖啦~
如果覺得立華奏很讚,或這篇文有幫助到你們的話,請留言或幫忙按個廣告吧。
您的支持是我寫文的最大動力。
如果失敗了,也請留言讓我知道,看看哪個環節出了問題,我有看到就會回。
希望這篇文有幫助到各位ξ( ✿>◡❛)
標題:在cv2中實現BGR轉LAB 或
在python cv2中進行正確的BGR2LAB 或
在python cv2中取得LAB
其實正確版要做兩個步驟,第一項是
步驟一:
img2=cv2.cvtColor (img, cv2.COLOR_BGR2LAB)
但是,轉出來的並不是正確的LAB。
步驟二:
還要再將LAB的L進行:L=L*100/255
再將LAB的A進行:A=A-128
再將LAB的B進行:B=B-128
記得型態要改成.astype('float')而非原來的uint8
如此一來便得到正確的BGR2LAB了。
標題:解決matplotlab的TypeError: 'str' object is not callable.問題
今天在利用matplotlab畫圖時,編輯器報了以下錯誤:
TypeError: 'str' object is not callable.
重開之後,圖已經可以畫了。
標題:[不用降版本]解決object arrays cannot be loaded when allow_pickle=false問題
今天在使用Python的np.load時發生以下錯誤:
object arrays cannot be loaded when allow_pickle=false
我們把np.load("file.npy")改成np.load("file.npy",allow_pickle=True)
然後再執行一次,npy檔已經可以載入了。