-
1 # 邵浩博士
-
2 # 歷歷萬世
1、建立一個python檔案,並匯入庫檔案:
import argparse
import numpy as np
from scipy import misc
import matplotlib.pyplot as plt
from sklearn import cluster
2、建立一個函式,用於解析輸入引數。我們需要把圖片和每個畫素被壓縮的 位元數傳進去作為輸入引數:
def build_arg_parser():
parser = argparse.ArgumentParser(description = "Compress the
input image \using clustering")
parser.add_argument("--input-file",dest="input_file",required =True,help="Input image")
parser.add_argument("--num-bits",dest="num_bits",required =False,type=int,help="Number of bits
used to repressent each pixel")
return parser
下圖為pycharm編譯器配置載入檔案的操作
3、建立一個函式,用來壓縮輸入圖片:
def compress_image(img,num_clusters):
# 將輸入的圖片轉換成(樣本量,特徵量)陣列,以執行k-means聚類演算法
X = img.reshape((-1,1))
kmeans = cluster.KMeans(n_clusters=num_clusters,n_init=4,
random_state=5)
kmeans.fit(X)
centroids = kmeans.cluster_centers_.squeeze()
labels = kmeans.labels_
# 為每個資料配置離它最近的中心點,並轉變為圖片的形狀
input_image_compressed = np.choose(labels,centroids).reshape(
img.shape)
retrun input_image_compressed
4、繪製圖像檢視壓縮演算法對圖片質量的影響:
def plot_image(img,title):
vmin = img.min()
vmax = img.max()
plt.figure()
plt.title(title)
plt.imshow(img,cmap=plt.cm.get_cmap("gray"),vmin=vmin,
vmax=vmax)
5、定義主函式,可以把輸入引數傳進去並進行處理,然後提取輸出圖片:
if __name__=="__main__":
args = build_arg_parser().parser_args()
input_file = args.input_file
num_bits= args.num_bits
if not 1<=num_bits<=8:
raise TypeError("Number of bits should be between 1 and 8")
num_clusters = no.power(2,num_bits)
# 列印壓縮率
compression_rate = round(100*(8.0-args.num_bits)/8.0,2)
print("\nThe size of the image will be reduced by a factor of",
8.0/args.num_bits)
print("\nCompression rate = "+str(compression_rate)+"%")
6、載入輸入圖片
input_image = misc.imread(input_file,True).astype(np.uint8)
plot_image(input_image,"Original image")
7、用輸入引數壓縮圖片
input_image_compressed = compress_image(input_image,
num_clusters)
plot_image(input_image_compressed,"Compressed_image;
compression rate = " + str(compression_rate) + "%")
plt.show()
8、在命令列工具中執行下面的命令,針對不同的壓縮位元數,顯示影象:
每個畫素的壓縮位元數將為4:
--input-file flower_image.jpg --num-bits 4
每個畫素的壓縮位元數將為2:
--input-file flower_image.jpg --num-bits 2
每個畫素的壓縮位元數將為1:
--input-file flower_image.jpg --num-bits 1
回覆列表
影象識別和色彩壓縮是兩個不同的任務。就影象識別而言,“識別”本身應該是一個分類任務,需要建立影象和標籤的對應訓練集合,然後用機器學習演算法(或者流行的深度學習方法)建立模型,並對影象進行識別。而聚類方法僅能對無標籤資料做一些初步的聚類。不知道你是否能把問題更具體描述下。