我正在尝试在 Matlab 中编写一个函数,该函数采用 unit8 类的 RGB 图像并加倍并将其转换为 YCBCR 图像。变换公式如下。
我会非常感谢任何形式的帮助。
我正在尝试在 Matlab 中编写一个函数,该函数采用 unit8 类的 RGB 图像并加倍并将其转换为 YCBCR 图像。变换公式如下。
我会非常感谢任何形式的帮助。
有一个图像处理工具箱功能,如果你可以访问它:RGB2YCBCR
如果您无权访问它,您可以通过以下方式自己进行转换:
rgbImage = imread('peppers.png'); %# A sample RGB image
A = [65.481 -37.797 112; ... %# A 3-by-3 matrix of scale factors
128.553 -74.203 -93.786; ...
24.966 112 -18.214];
%# First convert the RGB image to double precision, scale its values to the
%# range 0 to 1, reshape it to an N-by-3 matrix, and multiply by A:
ycbcrImage = reshape(double(rgbImage)./255,[],3)*A;
%# Shift each color plane (stored in each column of the N-by-3 matrix):
ycbcrImage(:,1) = ycbcrImage(:,1)+16;
ycbcrImage(:,2) = ycbcrImage(:,2)+128;
ycbcrImage(:,3) = ycbcrImage(:,3)+128;
%# Convert back to type uint8 and reshape to its original size:
ycbcrImage = reshape(uint8(ycbcrImage),size(rgbImage));
这是您在显示时获得的图像ycbcrImage
:
路径:
MATLAB\R2013a\toolbox\images\colorspaces\rgb2ycbcr.m
代码:
function ycbcr = rgb2ycbcr(varargin)
rgb = parse_inputs(varargin{:});
isColormap = false;
if (ndims(rgb) == 2)
isColormap=true;
colors = size(rgb,1);
rgb = reshape(rgb, [colors 1 3]);
end
origT = [65.481 128.553 24.966;-37.797 -74.203 112; 112 -93.786 -18.214];
origOffset = [16;128;128];
scaleFactor.double.T = 1/255;
scaleFactor.double.offset = 1/255;
scaleFactor.uint8.T = 1/255;
scaleFactor.uint8.offset = 1;
scaleFactor.uint16.T = 257/65535;
scaleFactor.uint16.offset = 257;
classIn = class(rgb);
T = scaleFactor.(classIn).T * origT;
offset = scaleFactor.(classIn).offset * origOffset;
ycbcr = zeros(size(rgb),classIn);
for p = 1:3
ycbcr(:,:,p) = imlincomb(T(p,1),rgb(:,:,1),T(p,2),rgb(:,:,2), T(p,3),rgb(:,:,3),offset(p));
end
if isColormap
ycbcr = reshape(ycbcr, [colors 3 1]);
end