求输入图像和经过离散余弦逆变换之后的图像的峰值信噪比。并求出离散余弦逆变换的比特率。

一、名词简介

DCT - 离散余弦变换,在(声音、图像)数据压缩中得到了广泛的使用。

PSNR - 峰值信噪比(Peak Signal to Noise Ratio)缩写为PSNR,用来表示信号最大可能功率和影响它的表示精度的破坏性噪声功率的比值,可以显示图像画质损失的程度。峰值信噪比越大,表示画质损失越小。

MSE - 均方误差,(mean-square error, MSE)是反映估计量与被估计量之间差异程度的一种度量。

二、参考c++代码

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <math.h>
#include <complex>const int height = 128, width = 128, channel = 3;// DCT超参数 DCT hyper-parameter
int T = 8;
int K = 4;// DCT coefficient
struct dct_str {double coef[height][width][channel];
};// 离散余弦变换 Discrete Cosine transformation
dct_str dct(cv::Mat img, dct_str dct_s){double I;double F;double Cu, Cv;for(int ys = 0; ys < height; ys += T){for(int xs = 0; xs < width; xs += T){for(int c = 0; c < channel; c++){for(int v = 0; v < T; v ++){for(int u = 0; u < T; u ++){F = 0;if (u == 0){Cu = 1. / sqrt(2);} else{Cu = 1;}if (v == 0){Cv = 1. / sqrt(2);}else {Cv = 1;}for (int y = 0; y < T; y++){for(int x = 0; x < T; x++){I = (double)img.at<cv::Vec3b>(ys + y, xs + x)[c];F += 2. / T * Cu * Cv * I * cos((2. * x + 1) * u * M_PI / 2. / T) * cos((2. * y + 1) * v * M_PI / 2. / T);}}dct_s.coef[ys + v][xs + u][c] = F;}}}}}return dct_s;
}// 逆离散余弦变换 Inverse Discrete Cosine transformation
cv::Mat idct(cv::Mat out, dct_str dct_s){double f;double Cu, Cv;for (int ys = 0; ys < height; ys += T){for (int xs = 0; xs < width; xs += T){for(int c = 0; c < channel; c++){for (int y = 0; y < T; y++){for (int x = 0; x < T; x++){f = 0;for (int v = 0; v < K; v++){for (int u = 0; u < K; u++){if (u == 0){Cu = 1. / sqrt(2);} else {Cu = 1;}if (v == 0){Cv = 1. / sqrt(2);} else { Cv = 1;}f += 2. / T * Cu * Cv * dct_s.coef[ys + v][xs + u][c] * cos((2. * x + 1) * u * M_PI / 2. / T) * cos((2. * y + 1) * v * M_PI / 2. / T);}}f = fmin(fmax(f, 0), 255);out.at<cv::Vec3b>(ys + y, xs + x)[c] = (uchar)f;}}}}}return out;
}// 计算均方误差 Compute MSE
double MSE(cv::Mat img1, cv::Mat img2){double mse = 0;for(int y = 0; y < height; y++){for(int x = 0; x < width; x++){for(int c = 0; c < channel; c++){mse += pow(((double)img1.at<cv::Vec3b>(y, x)[c] - (double)img2.at<cv::Vec3b>(y, x)[c]), 2);}}}mse /= (height * width);return mse;
}// 计算峰值信噪比 Compute PSNR
double PSNR(double mse, double v_max){return 10 * log10(v_max * v_max / mse);
}// 计算比例 Compute bitrate
double BITRATE(){return T * K * K / T * T;
}// Main
int main(int argc, const char* argv[]){double mse;double psnr;double bitrate;// read original imagecv::Mat img = cv::imread("imori.jpg", cv::IMREAD_COLOR);// DCT coefficientdct_str dct_s;// output imagecv::Mat out = cv::Mat::zeros(height, width, CV_8UC3);// DCTdct_s = dct(img, dct_s);// IDCTout = idct(out, dct_s);// MSE, PSNRmse = MSE(img, out);psnr = PSNR(mse, 255);bitrate = BITRATE();std::cout << "MSE: " << mse << std::endl;std::cout << "PSNR: " << psnr << std::endl;std::cout << "bitrate: " << bitrate << std::endl;cv::imwrite("out.jpg", out);//cv::imshow("answer", out);//cv::waitKey(0);cv::destroyAllWindows();return 0;
}

三、参考python代码

import cv2
import numpy as np
import matplotlib.pyplot as plt# DCT hyoer-parameter
T = 8
K = 4
channel = 3# DCT weight
def w(x, y, u, v):cu = 1.cv = 1.if u == 0:cu /= np.sqrt(2)if v == 0:cv /= np.sqrt(2)theta = np.pi / (2 * T)return (( 2 * cu * cv / T) * np.cos((2*x+1)*u*theta) * np.cos((2*y+1)*v*theta))# DCT
def dct(img):H, W, _ = img.shapeF = np.zeros((H, W, channel), dtype=np.float32)for c in range(channel):for yi in range(0, H, T):for xi in range(0, W, T):for v in range(T):for u in range(T):for y in range(T):for x in range(T):F[v+yi, u+xi, c] += img[y+yi, x+xi, c] * w(x,y,u,v)return F# IDCT
def idct(F):H, W, _ = F.shapeout = np.zeros((H, W, channel), dtype=np.float32)for c in range(channel):for yi in range(0, H, T):for xi in range(0, W, T):for y in range(T):for x in range(T):for v in range(K):for u in range(K):out[y+yi, x+xi, c] += F[v+yi, u+xi, c] * w(x,y,u,v)out = np.clip(out, 0, 255)out = np.round(out).astype(np.uint8)return out# MSE
def MSE(img1, img2):H, W, _ = img1.shapemse = np.sum((img1 - img2) ** 2) / (H * W * channel)return mse# PSNR
def PSNR(mse, vmax=255):return 10 * np.log10(vmax * vmax / mse)# bitrate
def BITRATE():return 1. * T * K * K / T / T# Read image
img = cv2.imread("imori.jpg").astype(np.float32)# DCT
F = dct(img)# IDCT
out = idct(F)# MSE
mse = MSE(img, out)# PSNR
psnr = PSNR(mse)# bitrate
bitrate = BITRATE()print("MSE:", mse)
print("PSNR:", psnr)
print("bitrate:", bitrate)# Save result
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.imwrite("out.jpg", out)

四、OpencvSharp版本部分代码

// 读取原始文件
Mat img = Cv2.ImRead(@"C:\Users\xiaomao\Desktop\lena.jpg", ImreadModes.Grayscale);
// 转为32FC1
Mat src = new Mat();
img.ConvertTo(src, MatType.CV_32FC1);// 进行离散余弦变换
Mat dct = new Mat(img.Size(), MatType.CV_32FC1);
Cv2.Dct(src, dct);// 进行逆离散余弦变换
Mat idct = new Mat(img.Size(), MatType.CV_32FC1);
Cv2.Idct(dct, idct);// 将逆离散余弦变换结果转换为8UC1
idct.ConvertTo(src, MatType.CV_8UC1);// 计算psnr,使用lena女神的图像测试结果为361.20199909921956
double psnr = Cv2.PSNR(img, idct);// 存储变换后的图像
Cv2.ImWrite(@"C:\Users\zyh\Desktop\lena_idct.jpg", src);

左侧是原图,右侧是基于原图灰度图进行离散余弦变换的结果图,肉眼可能是看不出来结果。psnr=361.20199909921956

数字图像处理 离散余弦变换(DCT)和峰值信噪比(PSNR)相关推荐

  1. 压缩感知稀疏基之离散余弦变换(DCT)和离散正弦变换(DST)

    题目:压缩感知稀疏基之离散余弦变换(DCT)和离散正弦变换(DST) 在前面一篇<压缩感知的常见稀疏基名称及离散傅里叶变换基>中集结了九篇压缩感知文献中有关稀疏基名称,并且直白地告诉大家稀 ...

  2. 二维离散变换由c语言编写,离散余弦变换(DCT)的DSP程序设计与实现

    <离散余弦变换(DCT)的DSP程序设计与实现>由会员分享,可在线阅读,更多相关<离散余弦变换(DCT)的DSP程序设计与实现(15页珍藏版)>请在人人文库网上搜索. 1.DS ...

  3. 离散余弦变换(DCT)原理及应用

    1.预备知识 1.1可分离变换 二维傅立叶变换可用通用的关系式来表示: 式中:x, u=0, 1, 2,  -,  M-1:y,  v=0,  1,  2,  -,  N-1:g(x,y,u,v)和h ...

  4. matlab snr mse,MATLAB 均方根误差MSE、两图像的信噪比SNR、峰值信噪比PSNR、结构相似性SSIM...

    今天的作业是求两幅图像的MSE.SNR.PSNR.SSIM.代码如下: clc; close all; X = imread('q1.tif');% 读取图像 Y=imread('q2.tif'); ...

  5. Python 不同分辨率图像峰值信噪比[PSNR]

    PNNR:全称为"Peak Signal-to-Noise Ratio",中文直译为峰值信噪比 前言 一.定义 二.Python代码 1.自定义 2.Tensorflow 总结 前 ...

  6. (python)计算图像峰值信噪比-PSNR、结构相似度-SSIM

    计算峰值信噪比-PSNR和结构相似度-SSIM(python实现) 说明: PSNR(Peak Signal to Noise Ratio),取值范围为:[0,100],PSNR值越大两张图片越相似, ...

  7. jpg图片与jpeg图片格式的区别(没有区别,.jpg只是扩展名.jpeg的缩写)JPEG图像压缩(YUV4:2:0 缩减采样、缩减取样)(离散余弦变换 DCT算法)(量化)(熵编码)(霍夫曼哈夫曼)

    文章目录 20191026 20220414 更新,更系统去了解里面的编码压缩流程 科普:关于图像格式JPG和JPEG你知多少? 一.前言 二.JPEG和JPG的关系 三.色彩空间转换 缩减取样 离散 ...

  8. 离散余弦变换(DCT)

    DCT变换.DCT反变换.分块DCT变换 一.引言 DCT变换的全称是离散余弦变换*(Discrete Cosine Transform)*,主要用于将数据或图像的压缩,能够将空域的信号转换到频域上, ...

  9. C语言实现离散余弦变换(DCT)并用MATLAB和Python验证

    概念 离散余弦变换(Discrete Cosine Transform,DCT)是可分离的变换,其变换核为余弦函数.是与傅里叶变换相关的一种变换,它相当于把离散傅里叶变换的虚数部分丢掉,只使用实数.D ...

  10. 离散余弦变换 DCT

    MPEG采用了Ahmed(一个巨牛的数学家) 等人于70年代提出的离散余弦变换(DCT-Discrete Cosine Transform)压缩算法,降低视频信号的空间冗余度. DCT将运动补偿误差或 ...

最新文章

  1. AI研发新药登上Nature子刊:46天合成潜在新药候选分子,比传统方法快15倍 | 开源...
  2. 进制转换应用场景_PLC编程:PLC内部各类型数据转换(整理分享)
  3. 前端编程提高之旅(六)----backbone实现todoMVC
  4. poj 1155 TELE
  5. 最新河南电信、网通(联通)、铁通DNS地址ip
  6. Early stopping conditioned on metric `acc` which is not available. Available metrics are: loss,val_l
  7. 用户流量红利消退的下半场,淘宝如何保持高速增长?
  8. handsome 404页面
  9. mx播放器有没有投屏功能_手机太小看电视不方便?教你一招迅速投屏到电视
  10. 老绅士+1,白嫖Wallpaper Engine创意工坊壁纸
  11. CLH lock queue的原理解释及Java实现
  12. 爬虫学习(14):selenium自动化测试(三):鼠标和键盘操作
  13. 『译』计算机体系结构发展史(四)
  14. 生鲜配送管理系统软件让生鲜产品一路“鲜”到家!
  15. module “pandas.tseries“ has no attribute “index“; module “pandas.core“ has no attribute “index“
  16. python的关系运算符可以连续使用_在Python中,关系运算符可以连续使用,例如15等价于13and35....
  17. 【Pytorch项目实战】之对抗攻击:无目标对抗攻击(FGSM)、有目标对抗攻击(FGSM)
  18. MySQL分库分表解决方案
  19. Flink 常用API(2)——转换算子+聚合算子
  20. 如果你是一名出纳,那么你应该掌握的知识(转)

热门文章

  1. msfconsole连接mysql数据库_kali2.0 msfconsole连接postgresql及启动armitage
  2. 初中参观机器人博物馆的作文_参观足球机器人实验室_550字
  3. Redis 集群原理
  4. 整体橱柜效果图软件测试,别被效果图骗了,最适合中国人的厨房设计是这样的...
  5. oracle建表代码,oracle建表脚本当中使用默认值 (转)
  6. Hightopo 2D 入门
  7. post接口请求测试,通俗易懂
  8. HttpResponseCode错误码整理
  9. Flask 使用abort方法返回http错误码、http错误响应信息
  10. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(一)