python cv 2画質圧縮のアルゴリズム例
opencvを使って画像を符号化する一方で、画像をバイナリ伝送する必要がある一方で、画像を圧縮する。jpeg圧縮を例として:
1、バイナリコードに変換
原図(48 k):
jpg圧縮:
圧縮された画像のサイズは、49.6 K、25.6 K、11 K、5.02 Kの順である。jpg圧縮は明らかで、極限まで圧縮すると色情報の損失が大きいです。
png圧縮:
圧縮された画像のサイズは、順次675 K、364 K、364 K、360 Kである。pngのフォーマットは大きすぎて、圧縮率が最高になっても360 Kがあります。そしてイメージングには明らかな変化がありません。
PS:画像を圧縮して保存することもできます。
初期バージョンはこのように書きます。
1、バイナリコードに変換
img = cv2.imread(img_path)
# :0~100, , ,
params = [cv2.IMWRITE_JPEG_QUALITY, ratio] # ratio:0~100
msg = cv2.imencode(".jpg", img, params)[1]
msg = (np.array(msg)).tobytes()
print("msg:", len(msg))
png圧縮に対して、
# :0~9, , ,
params = [cv2.IMWRITE_PNG_COMPRESSION, ratio] # ratio: 0~9
msg = cv2.imencode(".png", img, params)[1]
msg = (np.array(msg)).tobytes()
画像復号には、imdecodeを使用してnumpyタイプの画像に解くことができます。
img = cv2.imdecode(np.frombuffer(msg, np.uint8), cv2.IMREAD_COLOR)
print(img.shape, type(img))
2、画質圧縮原図(48 k):
jpg圧縮:
img_path = r"E:\img.jpg"
img = cv2.imread(img_path)
cv2.imwrite(r"E:\ret_80.jpg", img, [cv2.IMWRITE_JPEG_QUALITY, 80])
cv2.imwrite(r"E:\ret_40.jpg", img, [cv2.IMWRITE_JPEG_QUALITY, 40])
cv2.imwrite(r"E:\ret_10.jpg", img, [cv2.IMWRITE_JPEG_QUALITY, 10])
cv2.imwrite(r"E:\ret_0.jpg", img, [cv2.IMWRITE_JPEG_QUALITY, 0])
結果:圧縮された画像のサイズは、49.6 K、25.6 K、11 K、5.02 Kの順である。jpg圧縮は明らかで、極限まで圧縮すると色情報の損失が大きいです。
png圧縮:
img_path = r"E:\img.jpg"
img = cv2.imread(img_path)
cv2.imwrite(r"E:\ret_0.png", img, [cv2.IMWRITE_PNG_COMPRESSION, 0])
cv2.imwrite(r"E:\ret_3.png", img, [cv2.IMWRITE_PNG_COMPRESSION, 3])
cv2.imwrite(r"E:\ret_6.png", img, [cv2.IMWRITE_PNG_COMPRESSION, 6])
cv2.imwrite(r"E:\ret_9.png", img, [cv2.IMWRITE_PNG_COMPRESSION, 9])
結果:圧縮された画像のサイズは、順次675 K、364 K、364 K、360 Kである。pngのフォーマットは大きすぎて、圧縮率が最高になっても360 Kがあります。そしてイメージングには明らかな変化がありません。
PS:画像を圧縮して保存することもできます。
img_path = r"E:\img.jpg"
img = cv2.imread(img_path)
params = [cv2.IMWRITE_PNG_COMPRESSION, 0]
msg = cv2.imencode(".png", img, params)[1]
msg = (np.array(msg)).tobytes()
print("msg:", len(msg))
img = cv2.imdecode(np.frombuffer(msg, np.uint8), cv2.IMREAD_COLOR)
cv2.imwrite(rr"E:\ret.jpg", img)
バグ処理:初期バージョンはこのように書きます。
msg = (np.array(msg)).tostring()
:
msg = (np.array(msg)).tobytes()
img = cv2.imdecode(np.fromstring(msg, np.uint8), cv2.IMREAD_COLOR)
:
img = cv2.imdecode(np.frombuffer(msg, np.uint8), cv2.IMREAD_COLOR)
ここでは、python cv 2の画像品質圧縮のアルゴリズム例についての記事を紹介します。python cv 2の画像品質に関する圧縮の内容については、以前の記事を検索したり、以下の関連記事を見たりしてください。これからもよろしくお願いします。