When I try combining channels for RGB compressed image, the Image coloring if "off" and somewhat "yellow-ish"

1 次查看(过去 30 天)
I am trying to use DCT image compression on an RGB image by applying DCT to each separate channel and then recombining the channels in my final image. However, when I run my code, the output image is not fully colored, and I don't understand why. This is what the image looks like when using Matlab's DCT functions
This is what the image looks like after implementing my DCT image compression:
The following is my code:
clear all; close all;
X_int = imread('wombat.jpg');
redChannel = X_int(:, :, 1);
greenChannel = X_int(:, :, 2);
blueChannel = X_int(:, :, 3);
N=8;
Z=256;
%DCT FOR RED CHANNEL
B=zeros(256,256);
for r=1:N:256
for c=1:N:256
B(r:r+N-1,c:c+N-1)=redChannel(r:r+N-1,c:c+N-1);
[m n] = size(B);
%CREATE DCT
DCT=zeros(n);
for i=1:m
for j=1:n
if i==1
DCT(i,j) = ((1/n)^(1/2));
else
DCT(i,j) = ((2/n)^(1/2))*cos((pi*(2*j-1)*(i-1))/(2*n));
end
end
end
%APPLY DCT
Y=DCT*B*DCT';
%Zero out sub-antidiagonal entries
p=.1;
for i=1:n
for j=1:n
if i+j>p*2*n
Y(i,j) = 0;
end
end
end
ImageR = DCT'*Y*DCT;
end
end
%DCT FOR GREEN CHANNEL
BG=zeros(256,256);
for r=1:N:256
for c=1:N:256
BG(r:r+N-1,c:c+N-1)=greenChannel(r:r+N-1,c:c+N-1);
[s l] = size(BG);
%CREATE DCT
DCT=zeros(l);
for i=1:s
for j=1:l
if i==1
DCT(i,j) = ((1/l)^(1/2));
else
DCT(i,j) = ((2/l)^(1/2))*cos((pi*(2*j-1)*(i-1))/(2*l));
end
end
end
%Apply DCT
YG=DCT*B*DCT';
%Zero out sub-antidiagonal entries
p=.1;
for i=1:n
for j=1:n
if i+j>p*2*n
YG(i,j) = 0;
end
end
end
ImageG = DCT'*YG*DCT;
end
end
%DCT FOR BLUE CHANNEL
BB = zeros(256,256);
for r=1:N:256
for c=1:N:256
BB(r:r+N-1,c:c+N-1)=blueChannel(r:r+N-1,c:c+N-1);
[q w] = size(BB);
%Function to return DCT matrix of any size
DCT=zeros(w);
for i=1:q
for j=1:w
if i==1
DCT(i,j) = ((1/w)^(1/2));
else
DCT(i,j) = ((2/w)^(1/2))*cos((pi*(2*j-1)*(i-1))/(2*w));
end
end
end
%Apply DCT
YB=DCT*BB*DCT';
%Zero out sub-antidiagonal entries
p=.1;
for i=1:n
for j=1:n
if i+j>p*2*n
YB(i,j) = 0;
end
end
end
ImageB = DCT'*YB*DCT;
end
end
%CONCATENATE THE 3 RGB CHANNELS
red = uint8(ImageR);
green = uint8(ImageG);
blue = uint8(ImageB);
Isvd = cat(3,red,green,blue);
figure
imshow(Isvd);
imwrite(Isvd,'my_output_image.jpg');
  2 个评论
Stephen23
Stephen23 2017-4-28
@Kayla Kloster: please do not keep adding the same question repeatedly. You can simply edit the question instead.

请先登录,再进行评论。

采纳的回答

Jan
Jan 2017-4-28
编辑:Jan 2017-4-28
Your code contain 3 almost equal sections. Such redundancies are prone to bugs, because it is confusing to edit them. Prefer to use a loop over the 3 channels and call the same code section.
This confusing repeating of code sections decrease the readability and typos like this are almost invisible:
%DCT FOR GREEN CHANNEL
BG =zeros(256,256);
for r=1:N:256
for c=1:N:256
BG(r:r+N-1,c:c+N-1)=greenChannel(r:r+N-1,c:c+N-1);
...
%Apply DCT
YG=DCT*B*DCT';
% ^
You do not want "B" here, but BG.
The names for the different channels are not smart: B for red, BG for green, BB for blue.
  1 个评论
Kayla Kloster
Kayla Kloster 2017-4-28
Thanks so so much!! That was the issue. Yes I have noticed it have been extremely difficult to debug, so I will work on using a for loop instead of repeated sections.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Read, Write, and Modify Image 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by