- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在 MATLAB 中成功实现后,我正在尝试使用 openCV 复制 jpeg 算法。我注意到 MATLAB 和 OpenCV 对于从 RGB 到 YCbCr 的色彩空间转换给出了不同的结果。
查看OpenCV的文档,似乎唯一使用的函数是cv::cvtColor,但是打印Y、Cb和Cr的第一个8x8子矩阵,它们是不一样的。
这是我的 MATLAB 和 C++(使用 OpenCV 4.0.1)代码。
Matlab:
% Read rgb image
imgrgb = imread('lena512color.bmp');
% Convert to ycbcr
imgycbcr = rgb2ycbcr(imgrgb);
% Extract the 3 components
luma = imgycbcr (:,:,1);
cb = imgycbcr (:,:,2);
cr = imgycbcr (:,:,3);
C++:
// Load img
cv::Mat bgrImg = imread( "lena512color.bmp", cv::IMREAD_COLOR );
assert( bgrImg.data && "No image data");
// Declare an empty Mat for dst image
cv::Mat ycrcbImg;
// Convert to ycrcb
cv::cvtColor(bgrImg, ycrcbImg, cv::COLOR_BGR2YCrCb);
// Split bgr into 3 channels
cv::Mat bgrChan[3];
cv::split(bgrImg, bgrChan);
// Split ycrcb into 3 channels
cv::Mat ycrcbChan[3];
cv::split(ycrcbImg, ycrcbChan);
// Print first block for each channel
PRINT_MAT(ycrcbChan[0](cv::Rect(0, 0, 8, 8)), "LUMA (first 8x8 block)")
PRINT_MAT(ycrcbChan[1](cv::Rect(0, 0, 8, 8)), "Cr (first 8x8 block)")
PRINT_MAT(ycrcbChan[2](cv::Rect(0, 0, 8, 8)), "Cb (first 8x8 block)")
PRINT_MAT(bgrChan[0](cv::Rect(0, 0, 8, 8)), "Blue (first 8x8 block)")
PRINT_MAT(bgrChan[1](cv::Rect(0, 0, 8, 8)), "Green (first 8x8 block)")
PRINT_MAT(bgrChan[2](cv::Rect(0, 0, 8, 8)), "Red (first 8x8 block)")
其中 PRINT_MAT
是以下宏:
#define PRINT_MAT(mat, msg) std::cout<< std::endl <<msg <<":" <<std::endl <<mat <<std::endl;
打印出 RGB channel 后,我为 Matlab 和 OpenCV 获得了相同的值(对于第一个 8x8 block ),而对于 Y、Cb 和 Cr,我获得了不同的值。例如,对于 Luma 组件:
Matlab:
155 155 155 154 155 150 156 154
155 155 155 154 155 150 156 154
155 155 155 154 155 150 156 154
155 155 155 154 155 150 156 154
155 155 155 154 155 150 156 154
157 157 151 149 154 153 152 153
154 154 156 152 154 155 153 150
152 152 149 150 152 152 150 151
OpenCV:
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
164 164 158 155 161 159 159 160
160 160 163 158 160 162 159 156
159 159 155 157 158 159 156 157
什么是正确的转换?为什么结果不同?
最佳答案
通过查看 MATLAB 的 rgb2ycbcr
的源代码,转换是根据取自“Poynton 的“数字视频简介”(第 176 页,方程 9.6)":
origT = [ ...
65.481 128.553 24.966;...
-37.797 -74.203 112 ;...
112 -93.786 -18.214];
origOffset = [16; 128; 128];
ycbcr = origT * rgb + origOffset;
还提到:
If the input is
uint8
, then YCBCR isuint8
whereY
is in the range[16 235]
, andCb
andCr
are in the range[16 240]
.
In OCV ( implementation ) 另一方面,这是使用以下关系执行的:
请注意“Y、Cr 和 Cb 覆盖整个值范围。”。
如果我们在 MATLAB 中使用相同的方程式,我们会得到更接近 OCV 的结果(也许我使用的是不同的源图像)。例如,对于 Y
:
OCV_Y = 0.299*imgrgb(:,:,1) + 0.587*imgrgb(:,:,2) + 0.114*imgrgb(:,:,3);
给出第一个 8x8:
162 162 162 162 163 157 163 161
162 162 162 162 163 157 163 161
162 162 162 162 163 157 163 161
162 162 162 162 163 157 163 161
162 162 162 162 163 157 163 161
164 164 158 155 162 159 159 160
161 161 163 158 160 161 158 155
159 159 156 156 159 158 157 157
根据wikipedia article on YCbCr ,似乎 OCV 实现了“JPEG Conversion”变体,而 MATLAB 实现了 ITU-R BT.601 的“标准清晰度电视”变体。
总结:我会说这两个定义都是正确,但如果您特别关心 JPEG 的正确实现,我会说 OCV 的方式更好。无论如何,在 MATLAB 中实现任何其他变体都非常容易。
关于c++ - 使用 OpenCV 和 Matlab 从 RGB 到 YCbCr 的不同颜色转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54615539/
我正在阅读 java swing,但在理解它时遇到问题。 Color 是一个类吗? Color[] col= {Color.RED,Color.BLUE}; 这在java中是什么意思? 最佳答案 Is
我正在研究用 python 编写的 pacman 程序。其中一个模块是处理吃 bean 游戏的图形表示。这当然是一些主机颜色。列表如下: GHOST_COLORS = [] ## establishe
本网站:http://pamplonaenglishteacher.com 源代码在这里:https://github.com/Yorkshireman/pamplona_english_teache
我最近将我的手机更新为 Android Marshmallow 并在其上运行了我现有的应用程序,但注意到颜色行为有所不同:将更改应用到 View (可绘制)的背景时,共享相同背景的所有 View (引
所有 X11/w3c 颜色代码在 Android XML 资源文件格式中是什么样的? I know this looks a tad ridiculous as a question, but giv
试图让 ffmpeg 创建音频波形,同时能够控制图像大小、颜色和幅度。我已经尝试过这个(以及许多变体),但它只是返回无与伦比的 "。 ffmpeg -i input -filter_complex "
我很好奇你是否有一些关于 R 中颜色酿造的技巧,对于许多独特的颜色,以某种方式使图表仍然好看。 我需要大量独特的颜色(至少 24 种,可能需要更多,~50 种)用于堆叠区域图(所以不是热图,渐变色不起
我看到的许多 WPF 示例和示例似乎都有硬编码的颜色。这些指南 - http://msdn.microsoft.com/en-us/library/aa350483.aspx建议不要硬编码颜色。在构建
我想更改文件夹的默认蓝色 如何设置? 最佳答案 :hi Directory guifg=#FF0000 ctermfg=red 关于Vim NERDTree 颜色,我们在Stack Overflow上
是否有关于如何将任意字符串哈希为 RGB 颜色值的最佳实践?或者更一般地说:3 个字节。 你问:我什么时候需要这个?这对我来说并不重要,但想象一下任何 GitHub 上的那些管图 network pa
我正在尝试将默认颜色设置为自定义窗口小部件。 这是有问题的代码。 class ReusableCard extends StatelessWidget { ReusableCard({this.
import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.Ta
我有一个 less 文件来定义一堆颜色/颜色。每个类名都包含相关颜色的名称,例如 .colourOrange{..} 或 .colourBorderOrange{..} 或 navLeftButtOr
我有一个RelativeLayout,我需要一个黑色背景和一个位于其中间的小图像。我使用了这段代码: 其中@drawable/bottom_box_back是: 这样我就可以将图像居中了。但背
我需要设置 浅色 的 JPanel 背景,只是为了不覆盖文本(粗体黑色)。 此刻我有这个: import java.util.Random; .... private Random random =
我正在尝试制作一个自定义文本编辑器,可以更改特定键入单词的字体和颜色。如何更改使用光标突出显示的文本的字体和/或颜色? 我还没有尝试过突出显示部分。我尝试获取整个 hEdit(HWND) 区域并更改字
我想改变我整个应用程序的颜色。 在我的 AndroidManfiest.xml 中,我有正确的代码: 在 values 文件夹中,我有 app_theme.xml: @style/MyAc
是否可以使用 android 数据绑定(bind)从 xml 中引用颜色? 这很好用: android:textColor="@{inputValue == null ? 0xFFFBC02D : 0
有没有办法在 Android 应用程序中设置“空心”颜色? 我的意思是我想要一个带有某种背景的框,而文本实际上会导致背景透明。换句话说,如果整个 View 在蓝色背景上,文本将是蓝色的,如果它是红色的
我用CGContextStrokePath画在白色背景图片中的一条直线上,描边颜色为红色,alpha为1.0画线后,为什么点不是(255, 0, 0),而是(255, 96, 96)为什么不是纯红色?
我是一名优秀的程序员,十分优秀!