一:學(xué)會正確使用numpy scipy。 numpy scipy寫好的絕不自己寫,比如矩陣運算等操作,pylab的實現(xiàn)還算不錯。各種函數(shù)都有,盡量使用他們可以避免初學(xué)者大部分的速度不足問題。因為這些函數(shù)大部分都是預(yù)編譯好的。
站在用戶的角度思考問題,與客戶深入溝通,找到曹縣網(wǎng)站設(shè)計與曹縣網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、國際域名空間、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋曹縣地區(qū)。
根據(jù)我?guī)啄昵暗臏y試,python的矩陣運算速度并不慢,(因為你運行的是動態(tài)鏈接庫里面的函數(shù)而不是腳本)比mathematica快,和matlab持平。
大部分新手不擅長看文檔啥都自己造輪子是不好的。當(dāng)然老手把效率寫的比開源庫高也不算啥新聞,畢竟有對特定程序的優(yōu)化
二:減少for的使用,多使用向量化函數(shù),np.vectorlize可以把函數(shù)變成對數(shù)組逐元素的操作,比for效率高幾個華萊士。
三:對內(nèi)存友好,操作大矩陣的時候減少會引起整矩陣對此copy的操作
四:系統(tǒng)最慢的大部分時候是io,包括上面說的內(nèi)存操作和頻繁的讀入讀出以及debug輸出。避免他們,在需要實時處理的時候引入類似于gpu的pipeline管線機制或者使用靈活的多線程編程可以起到奇效。
五:matplotlib的繪圖效率并不高明,在使用交互繪圖(plt.ion)的時候減少不必要的刷新率。
1. Pandas.apply() – 特征工程瑰寶
Pandas 庫已經(jīng)非常優(yōu)化了,但是大部分人都沒有發(fā)揮它的最大作用。想想它一般會用于數(shù)據(jù)科學(xué)項目中的哪些地方。一般首先能想到的就是特征工程,即用已有特征創(chuàng)造新特征。其中最高效的方法之一就是Pandas.apply(),即Pandas中的apply函數(shù)。
在Pandas.apply()中,可以傳遞用戶定義功能并將其應(yīng)用到Pandas Series的所有數(shù)據(jù)點中。這個函數(shù)是Pandas庫最好的擴展功能之一,它能根據(jù)所需條件分隔數(shù)據(jù)。之后便能將其有效應(yīng)用到數(shù)據(jù)處理任務(wù)中。
2. Pandas.DataFrame.loc – Python數(shù)據(jù)操作絕妙技巧
所有和數(shù)據(jù)處理打交道的數(shù)據(jù)科學(xué)家(差不多所有人了!)都應(yīng)該學(xué)會這個方法。
很多時候,數(shù)據(jù)科學(xué)家需要根據(jù)一些條件更新數(shù)據(jù)集中某列的某些值。Pandas.DataFrame.loc就是此類問題最優(yōu)的解決方法。
3. Python函數(shù)向量化
另一種解決緩慢循環(huán)的方法就是將函數(shù)向量化。這意味著新建函數(shù)會應(yīng)用于輸入列表,并返回結(jié)果數(shù)組。在Python中使用向量化能至少迭代兩次,從而加速計算。
事實上,這樣不僅能加速代碼運算,還能讓代碼更加簡潔清晰。
4. Python多重處理
多重處理能使系統(tǒng)同時支持一個以上的處理器。
此處將數(shù)據(jù)處理分成多個任務(wù),讓它們各自獨立運行。處理龐大的數(shù)據(jù)集時,即使是apply函數(shù)也顯得有些遲緩。
關(guān)于優(yōu)化Python編程的4個妙招,青藤小編就和您分享到這里了。如果您對python編程有濃厚的興趣,希望這篇文章可以為您提供幫助。如果您還想了解更多關(guān)于python編程的技巧及素材等內(nèi)容,可以點擊本站的其他文章進行學(xué)習(xí)。
一、作用不同
1、intvar():屬于Tkinter下的對象。用于處理整型。
2、stringvar():StringVar并不是python內(nèi)建的對象,而是屬于Tkinter下的對象。
二、值變化不同
1、intvar():不需要跟蹤變量的值的變化。
2、stringvar():需要跟蹤變量的值的變化,以保證值的變更隨時可以顯示在界面上。
三、特點不同
1、intvar():intVar類型調(diào)用get函數(shù)時,先將變量轉(zhuǎn)變成了tuples類型的數(shù)據(jù)。
2、stringvar():StringVar類型調(diào)用set函數(shù)時,先將變量轉(zhuǎn)變成了tuples類型的數(shù)據(jù)。實際上調(diào)用set函數(shù)之前就直接使用Tuples類型的數(shù)據(jù).
參考資料來源:百度百科-Tkinter
參考資料來源:百度百科-Python
Python發(fā)展到現(xiàn)在,其實不簡單了。 說簡單,只是你自己不夠與時俱進,掌握的都是老式三板斧而已。所以,知識需要不斷更新,才能彌補自己的盲點,以上就是本文的全部內(nèi)容,希望能大家的學(xué)習(xí)或者工作帶來一定的幫助。
import CV2
import copy
import numpy as np
import random
使用的是pycharm
因為最近看了《銀翼殺手2049》,里面Joi實在是太好看了所以原圖像就用Joi了
要求是灰度圖像,所以第一步先把圖像轉(zhuǎn)化成灰度圖像
# 讀入原始圖像
img = CV2.imread('joi.jpg')
# 灰度化處理
gray = CV2.cvtColor(img, CV2.COLOR_BGR2GRAY)
CV2.imwrite('img.png', gray)
第一個任務(wù)是利用分段函數(shù)增強灰度對比,我自己隨便寫了個函數(shù)大致是這樣的
def chng(a):
if a 255/3:
b = a/2
elif a 255/3*2:
b = (a-255/3)*2 + 255/6
else:
b = (a-255/3*2)/2 + 255/6 +255/3*2
return b
rows = img.shape[0]
cols = img.shape[1]
cover = copy.deepcopy(gray)
for i in range(rows):
for j in range(cols):
cover[i][j] = chng(cover[i][j])
CV2.imwrite('cover.png', cover)
下一步是直方圖均衡化
# histogram equalization
def hist_equal(img, z_max=255):
H, W = img.shape
# S is the total of pixels
S = H * W * 1.
out = img.copy()
sum_h = 0.
for i in range(1, 255):
ind = np.where(img == i)
sum_h += len(img[ind])
z_prime = z_max / S * sum_h
out[ind] = z_prime
out = out.astype(np.uint8)
return out
covereq = hist_equal(cover)
CV2.imwrite('covereq.png', covereq)
在實現(xiàn)濾波之前先添加高斯噪聲和椒鹽噪聲(代碼來源于網(wǎng)絡(luò))
不知道這個椒鹽噪聲的名字是誰起的感覺隔壁小孩都饞哭了
用到了random.gauss()
percentage是噪聲占比
def GaussianNoise(src,means,sigma,percetage):
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum):
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
NoiseImg[randX, randY]=NoiseImg[randX,randY]+random.gauss(means,sigma)
if NoiseImg[randX, randY] 0:
NoiseImg[randX, randY]=0
elif NoiseImg[randX, randY]255:
NoiseImg[randX, randY]=255
return NoiseImg
def PepperandSalt(src,percetage):
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum):
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
if random.randint(0,1)=0.5:
NoiseImg[randX,randY]=0
else:
NoiseImg[randX,randY]=255
return NoiseImg
covereqg = GaussianNoise(covereq, 2, 4, 0.8)
CV2.imwrite('covereqg.png', covereqg)
covereqps = PepperandSalt(covereq, 0.05)
CV2.imwrite('covereqps.png', covereqps)
下面開始均值濾波和中值濾波了
就以n x n為例,均值濾波就是用這n x n個像素點灰度值的平均值代替中心點,而中值就是中位數(shù)代替中心點,邊界點周圍補0;前兩個函數(shù)的作用是算出這個點的灰度值,后兩個是對整張圖片進行
#均值濾波模板
def mean_filter(x, y, step, img):
sum_s = 0
for k in range(x-int(step/2), x+int(step/2)+1):
for m in range(y-int(step/2), y+int(step/2)+1):
if k-int(step/2) 0 or k+int(step/2)+1 img.shape[0]
or m-int(step/2) 0 or m+int(step/2)+1 img.shape[1]:
sum_s += 0
else:
sum_s += img[k][m] / (step*step)
return sum_s
#中值濾波模板
def median_filter(x, y, step, img):
sum_s=[]
for k in range(x-int(step/2), x+int(step/2)+1):
for m in range(y-int(step/2), y+int(step/2)+1):
if k-int(step/2) 0 or k+int(step/2)+1 img.shape[0]
or m-int(step/2) 0 or m+int(step/2)+1 img.shape[1]:
sum_s.append(0)
else:
sum_s.append(img[k][m])
sum_s.sort()
return sum_s[(int(step*step/2)+1)]
def median_filter_go(img, n):
img1 = copy.deepcopy(img)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
img1[i][j] = median_filter(i, j, n, img)
return img1
def mean_filter_go(img, n):
img1 = copy.deepcopy(img)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
img1[i][j] = mean_filter(i, j, n, img)
return img1
完整main代碼如下:
if __name__ == "__main__":
# 讀入原始圖像
img = CV2.imread('joi.jpg')
# 灰度化處理
gray = CV2.cvtColor(img, CV2.COLOR_BGR2GRAY)
CV2.imwrite('img.png', gray)
rows = img.shape[0]
cols = img.shape[1]
cover = copy.deepcopy(gray)
for i in range(rows):
for j in range(cols):
cover[i][j] = chng(cover[i][j])
CV2.imwrite('cover.png', cover)
covereq = hist_equal(cover)
CV2.imwrite('covereq.png', covereq)
covereqg = GaussianNoise(covereq, 2, 4, 0.8)
CV2.imwrite('covereqg.png', covereqg)
covereqps = PepperandSalt(covereq, 0.05)
CV2.imwrite('covereqps.png', covereqps)
meanimg3 = mean_filter_go(covereqps, 3)
CV2.imwrite('medimg3.png', meanimg3)
meanimg5 = mean_filter_go(covereqps, 5)
CV2.imwrite('meanimg5.png', meanimg5)
meanimg7 = mean_filter_go(covereqps, 7)
CV2.imwrite('meanimg7.png', meanimg7)
medimg3 = median_filter_go(covereqg, 3)
CV2.imwrite('medimg3.png', medimg3)
medimg5 = median_filter_go(covereqg, 5)
CV2.imwrite('medimg5.png', medimg5)
medimg7 = median_filter_go(covereqg, 7)
CV2.imwrite('medimg7.png', medimg7)
medimg4 = median_filter_go(covereqps, 7)
CV2.imwrite('medimg4.png', medimg4)