OpenCV實現圖片編解碼實踐
原圖:
圖像信息,可以看到圖像是一個816*2100像素的圖片:
python代碼:
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('11.jpg', 0) img1 = img.astype('float') img_dct = cv2.dct(img1) img_dct_log = np.log(abs(img_dct)) img_recor = cv2.idct(img_dct) recor_temp = img_dct[0:100,0:100] recor_temp2 = np.zeros(img.shape) recor_temp2[0:100,0:100] = recor_temp print recor_temp.shape print recor_temp2.shape img_recor1 = cv2.idct(recor_temp2) plt.subplot(221) plt.imshow(img) plt.title('original') plt.subplot(222) plt.imshow(img_dct_log) plt.title('dct transformed') plt.subplot(223) plt.imshow(img_recor) plt.title('idct transformed') plt.subplot(224) plt.imshow(img_recor1) plt.title('idct transformed2') plt.show()
僅僅提取一個100*100的DCT系數後的效果:
當用800*1000的DCT系數:
可以看到圖像細節更豐富瞭一些:
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('11.jpg', 0) img1 = img.astype('float') img_dct = cv2.dct(img1) img_dct_log = np.log(abs(img_dct)) img_recor = cv2.idct(img_dct) recor_temp = img_dct[0:800,0:1000] recor_temp2 = np.zeros(img.shape) recor_temp2[0:800,0:1000] = recor_temp print recor_temp.shape print recor_temp2.shape img_recor1 = cv2.idct(recor_temp2) plt.subplot(221) plt.imshow(img) plt.title('original') plt.subplot(222) plt.imshow(img_dct_log) plt.title('dct transformed') plt.subplot(223) plt.imshow(img_recor) plt.title('idct transformed') plt.subplot(224) plt.imshow(img_recor1) plt.title('idct transformed2') plt.show()
當用816*1200的DCT系數:
可以看出圖像恢復到原來的質量瞭.
分析代碼:
img_dct保存的是dct變換後的矩陣,img_dct_log是矩陣中的元素首先取絕對值,再求對數的矩陣.
img_dct_log = np.log(abs(img_dct))
那麼對數的底是多少呢?
打印出來img_dct_log和abs(img_dct)看一下:
打印結果:
其中9.45971865e+04=9.45971865 x 10^4 =94597.1865表示的是科學計數法.
我們看到隻有在底數取e的時候,對應的對數才符合題目輸出要求,所以,python numpy.log函數取的是以自然常數e為地的對數.
到此這篇關於OpenCV實現圖片編解碼實踐的文章就介紹到這瞭,更多相關OpenCV 圖片編解碼內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- OpenCV-Python 對圖像的基本操作代碼
- 推薦五個常用的python圖像處理庫
- OpenCV+Python幾何變換的實現示例
- OpenCV圖像變換之傅裡葉變換的一些應用
- python 基於opencv實現圖像增強