Python3.6實現編碼圖像(ppm和jpg)的輸出
來自專欄 物聯網技術
原創
轉載請註明出處,侵權必究。
1、反向不歸零(NRZ)
反向不歸零編碼用高電平表示二進位的1,用低電平表示二進位的0。
2、曼徹斯特編碼
在曼徹斯特編碼中,用電壓跳變的相位不同來區分1和0,其中從高到低的跳變表示1,從低到高的跳變表示0。
3、差動雙相(DBP)編碼
差動雙相編碼在半個比特周期中的任意的邊沿表示二進位「0」,而沒有邊沿就是二進位「1」,如下圖所示。此外在每個比特周期開始時,電平都要反相。因此,對於接收器來說,位節拍比較容易重建。
4、PIE編碼
PIE編碼符號有4個,分別是數據0、數據1、數據幀開始SOF和數據幀結束EOF。
5、Python3.6實現效果和代碼
輸入界面:
圖像輸出到目錄下(包括jpg和ppm):
import numpy as npfrom PIL import Imageimport sys# 異常class StringError(Exception): def __init__(self,err): Exception.__init__(self) self.err=err def getNRZ(binum,line_pixes=3,bi_pixes=90,pic_height=400,y_max=350,y_min=50): """ 反向不歸零編碼(NRZ) binum:輸入的二進位碼 line_pixes:線的寬度(像素);bi_pixes:1位編碼的寬度;pic_height圖片高;y_max:線的最高點;y_min線的最低點 """ last_bi = 2 #存儲上一次數據,2表示剛開始 pic_np = np.ones((bi_pixes * (len(binum)+1),pic_height),dtype=np.int) for index,item in enumerate(binum): try: if last_bi != item and last_bi != 2: pic_np[(index*bi_pixes - line_pixes):(index*bi_pixes + line_pixes),y_min:y_max]=0 if item == 1: # 1劃橫線 pic_np[index*bi_pixesindex+1)*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)]=0 last_bi = 1 elif item == 0: pic_np[index*bi_pixesindex+1)*bi_pixes,(y_min-line_pixes):(y_min+line_pixes)]=0 last_bi = 0 else: raise StringError(
!!! ERROR !!! : Your binary string is NOT 0 or 1) except StringError as var: print(var.err) sys.exit() return pic_np def getManchester(binum,line_pixes=3,bi_pixes=90,pic_height=400,y_max=350,y_min=50): """ 曼徹斯特(Manchester)編碼 binum:輸入的二進位碼 line_pixes:線的寬度(像素);bi_pixes:1位編碼的寬度;pic_height圖片高;y_max:線的最高點;y_min線的最低點 """ last_bi = 2 #存儲上一次數據,2表示剛開始 pic_np = np.ones((bi_pixes * (len(binum)+1),pic_height),dtype=np.int8) for index,item in enumerate(binum): try: if last_bi == item and last_bi != 2: pic_np[(index*bi_pixes - line_pixes):(index*bi_pixes + line_pixes),y_min:y_max]=0 if item == 1: # 1劃橫線 pic_np[index*bi_pixes2*index+1)*bi_pixes//2,(y_max-line_pixes):(y_max+line_pixes)]=0 pic_np[(2*index+1)*bi_pixes//2index+1)*bi_pixes,(y_min-line_pixes):(y_min+line_pixes)]=0 pic_np[((2*index+1)*bi_pixes//2 - line_pixes):((2*index+1)*bi_pixes//2 + line_pixes),y_min:y_max]=0 last_bi = 1 elif item == 0: pic_np[index*bi_pixes2*index+1)*bi_pixes//2,(y_min-line_pixes):(y_min+line_pixes)]=0 pic_np[(2*index+1)*bi_pixes//2index+1)*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)]=0 pic_np[((2*index+1)*bi_pixes//2 - line_pixes):((2*index+1)*bi_pixes//2 + line_pixes),y_min:y_max]=0 last_bi = 0 else: raise StringError(
!!! ERROR !!! : Your binary string is NOT 0 or 1) except StringError as var: print(var.err) sys.exit() return pic_np def getDBP(binum,line_pixes=3,bi_pixes=90,pic_height=400,y_max=350,y_min=50): """ 差動雙相(DBP)編碼 binum:輸入的二進位碼 line_pixes:線的寬度(像素);bi_pixes:1位編碼的寬度;pic_height圖片高;y_max:線的最高點;y_min線的最低點 """ last_level = 0 #存儲上一次最後的電平,0表示剛開始 pic_np = np.ones((bi_pixes * (len(binum)+1),pic_height),dtype=np.int8) for index,item in enumerate(binum): try: if item == 1: # 1劃橫線 if last_level == 0: pic_np[index*bi_pixesindex+1)*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)] = 0 last_level = 1 else : pic_np[index*bi_pixesindex+1)*bi_pixes,(y_min-line_pixes):(y_min+line_pixes)] = 0 last_level = 0 elif item == 0: if last_level == 0: pic_np[index*bi_pixes2*index+1)*bi_pixes//2,(y_max-line_pixes):(y_max+line_pixes)] = 0 pic_np[(2*index+1)*bi_pixes//2index+1)*bi_pixes,(y_min-line_pixes):(y_min+line_pixes)] = 0 pic_np[((2*index+1)*bi_pixes//2 - line_pixes):((2*index+1)*bi_pixes//2 + line_pixes),y_min:y_max] = 0 last_level = 0 else : pic_np[index*bi_pixes2*index+1)*bi_pixes//2,(y_min-line_pixes):(y_min+line_pixes)] = 0 pic_np[(2*index+1)*bi_pixes//2index+1)*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)] = 0 pic_np[((2*index+1)*bi_pixes//2 - line_pixes):((2*index+1)*bi_pixes//2 + line_pixes),y_min:y_max] = 0 last_level = 1 else: raise StringError(
!!! ERROR !!! : Your binary string is NOT 0 or 1) except StringError as var: print(var.err) sys.exit() pic_np[((index+1)*bi_pixes- line_pixes):((index+1)*bi_pixes + line_pixes),y_min:y_max] = 0 return pic_np def getPIE(binum,line_pixes=2,bi_pixes=40,pic_height=200,y_max=150,y_min=50): """ PIE編碼 binum:輸入的二進位碼 line_pixes:線的寬度(像素);bi_pixes:1位編碼的寬度;pic_height圖片高;y_max:線的最高點;y_min線的最低點 """ Tari = 16 # 電平周期個數,加上SOF和EOF for item in binum: Tari += (int(item)+1)*2 pic_np = np.ones((bi_pixes * (Tari+1),pic_height),dtype=np.int8) # SOF pic_np[0:line_pixes,y_min:y_max] = 0 pic_np[0:bi_pixes,(y_min-line_pixes):(y_min+line_pixes)] = 0 pic_np[bi_pixes-line_pixes:bi_pixes+line_pixes,y_min:y_max] = 0 pic_np[bi_pixes:2*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)] = 0 pic_np[2*bi_pixes-line_pixes:2*bi_pixes+line_pixes,y_min:y_max] = 0 pic_np[2*bi_pixes:3*bi_pixes,(y_min-line_pixes):(y_min+line_pixes)] = 0 pic_np[3*bi_pixes-line_pixes:3*bi_pixes+line_pixes,y_min:y_max] = 0 pic_np[3*bi_pixes:8*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)] = 0 pic_np[8*bi_pixes-line_pixes:8*bi_pixes+line_pixes,y_min:y_max] = 0 # 0和1 idx = 8 #用於保存運行完高低電平後的下標 for index,item in enumerate(binum): try: if item == 1: # 1劃橫線 pic_np[idx*bi_pixes-line_pixes:idx*bi_pixes+line_pixes,y_min:y_max] = 0 pic_np[(1+idx)*bi_pixes-line_pixes1+idx)*bi_pixes+line_pixes,y_min:y_max] = 0 pic_np[(4+idx)*bi_pixes-line_pixes4+idx)*bi_pixes+line_pixes,y_min:y_max] = 0 pic_np[idx*bi_pixes1+idx)*bi_pixes,y_min-line_pixes:y_min+line_pixes] = 0 pic_np[(1+idx)*bi_pixes4+idx)*bi_pixes,y_max-line_pixes:y_max+line_pixes] = 0 idx += 4 elif item == 0: pic_np[idx*bi_pixes-line_pixes:idx*bi_pixes+line_pixes,y_min:y_max] = 0 pic_np[(1+idx)*bi_pixes-line_pixes1+idx)*bi_pixes+line_pixes,y_min:y_max] = 0 pic_np[(2+idx)*bi_pixes-line_pixes2+idx)*bi_pixes+line_pixes,y_min:y_max] = 0 pic_np[idx*bi_pixes1+idx)*bi_pixes,y_min-line_pixes:y_min+line_pixes] = 0 pic_np[(1+idx)*bi_pixes2+idx)*bi_pixes,y_max-line_pixes:y_max+line_pixes] = 0 idx += 2 else: raise StringError(
!!! ERROR !!! : Your binary string is NOT 0 or 1) except StringError as var: print(var.err) sys.exit() # EOF pic_np[idx*bi_pixes-line_pixes:idx*bi_pixes+line_pixes,y_min:y_max] = 0 pic_np[idx*bi_pixes:idx*bi_pixes+bi_pixes,(y_min-line_pixes):(y_min+line_pixes)] = 0 pic_np[idx*bi_pixes+bi_pixes-line_pixesidx+1)*bi_pixes+line_pixes,y_min:y_max] = 0 pic_np[(idx+1)*bi_pixesidx+8)*bi_pixes,(y_max-line_pixes):(y_max+line_pixes)] = 0 return pic_np # 輸入二進位binum = input("Please input your binary string: ") print("You input ""+binum+""")## NRZ img = Image.fromarray(getNRZ(binum).T*255.0)img = img.convert(L)img = img.transpose(Image.FLIP_TOP_BOTTOM) img.save(NRZ.ppm)img.save(NRZ.jpg)img.show()##Manchesterimg = Image.fromarray(getManchester(binum).T*255.0)img = img.convert(L)img = img.transpose(Image.FLIP_TOP_BOTTOM) img.save(Manchester.ppm)img.save(Manchester.jpg)img.show()##DBPimg = Image.fromarray(getDBP(binum).T*255.0)img = img.convert(L)img = img.transpose(Image.FLIP_TOP_BOTTOM) img.save(DBP.ppm)img.save(DBP.jpg)img.show()#PIEimg = Image.fromarray(getPIE(binum).T*255.0)img = img.convert(L)img = img.transpose(Image.FLIP_TOP_BOTTOM) img.save(PIE.ppm)img.save(PIE.jpg)img.show()
推薦閱讀:
※演算法 - 二叉樹的10種遍歷方法,你都會了么?( 二 )
※基數排序
※好好玩的螺旋演算法No.69
※python邏輯回歸演算法預測
※基於深度學習的廣告CTR預估演算法