Who know how to do this interpolation problem

2 Ansichten (letzte 30 Tage)
DI
DI am 19 Dez. 2012
Kommentiert: Image Analyst am 22 Okt. 2016
Image processing. Write a function to display a color image, as well as its red, green, and blue layers separately. The function declaration should be im=displayRGB(filename). filename should be the name of the image (make the function work for *.jpg images only). imshould be the final image returned as a matrix. To test the function, you should put a jpg file into the same directory as the function and run it with the filename (include the extension, for example im=displayRGB(‘testImage.jpg’)). You can use any picture you like, from your files or off the internet. Useful functions: imread, meshgrid, interp2, uint8, image, axis equal, axis tight.
a.
To make the program work efficiently with all image sizes, first interpolate each color layer of the original image so that the larger dimension ends up with 800 pixels. The smaller dimension should be appropriately scaled so that the length:width ratio stays the same. Use interp2 with cubic interpolation to resample the image.
b.
Create a composite image that is 2 times as tall as the original, and 2 times as wide. Place the original image in the top left, the red layer in the top right, the green layer in the bottom left, and the blue layer in the bottom right parts of this composite image. The function should return the composite image matrix in case you want to save it as a jpg again (before displaying or returning, convert the values to unsigned 8-bit integers using uint8). Hint: To get just a single color layer, all you have to do is set the other two layers to zero. For example if X is an MxNx3 image, then X(:,:,2)=0; X(:,:,3)=0; will retain just the red layer. Include your code and the final image in your homework writeup.
I am a self-taught beginner. And the material I use does not specifically talk about the like "pixels' or how to interpolate each color layer of the original picture, it is focused more on the algebra calculation. Thus, I have no idea at all for this question. Can someone help me? Thanks a lot!

Akzeptierte Antwort

Image Analyst
Image Analyst am 19 Dez. 2012
I don't agree with the way your instructor told you to get just a single color layer. Setting other color layers to zero leaves it a color image. Use this code to extract just a single color channel:
% Extract the individual red, green, and blue color channels.
redChannel = rgbImage(:, :, 1);
greenChannel = rgbImage(:, :, 2);
blueChannel = rgbImage(:, :, 3);
Aren't there examples for interp2() in the help that you can look at?
  10 Kommentare
Image Analyst
Image Analyst am 22 Dez. 2012
This is probably more of a hint that you should honestly be getting. There's still a little left to do, and you should do that yourself. But go ahead and mark as "Answered' if you have no more questions.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
imtool close all; % Close all imtool figures.
clear; % Erase all existing variables.
workspace; % Make sure the workspace panel is showing.
format longg;
format compact;
fontSize = 20;
% Read in a standard MATLAB color demo image.
folder = fullfile(matlabroot, '\toolbox\images\imdemos');
baseFileName = 'peppers.png';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
if ~exist(fullFileName, 'file')
% Didn't find it there. Check the search path for it.
fullFileName = baseFileName; % No path this time.
if ~exist(fullFileName, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
rgbImage = imread(fullFileName);
% Get the dimensions of the image. numberOfColorBands should be = 3.
[rows columns numberOfColorBands] = size(rgbImage);
% Extract the individual red, green, and blue color channels.
redChannel = rgbImage(:, :, 1);
greenChannel = rgbImage(:, :, 2);
blueChannel = rgbImage(:, :, 3);
blackImage = uint8(zeros(rows, columns));
newRedChannel = [redChannel, redChannel; blackImage, blackImage];
newGreenChannel = [greenChannel, blackImage; greenChannel, blackImage];
newBlueChannel = [blueChannel, blackImage; blackImage, blueChannel];
newRGBImage = cat(3, newRedChannel, newGreenChannel, newBlueChannel);
% Display the original color image.
imshow(newRGBImage, []);
title('New Color Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
DI
DI am 23 Dez. 2012
Yeah.I need to do more. Thanks a lot for your help

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Sumayyah Hai
Sumayyah Hai am 22 Okt. 2016
I tried writing a code to solve this problem and I got pretty far. I resized the image to have a standard resolution where the maximum pixel dimension is 800. And can display the original image and all of its red, green, blue layers in separate images. Although I'm getting a problem when I'm trying to insert these 4 image arrays inside one large composite array to get one single image with the original image and its other 3 layers like this:
I get as far as the top left image in its position and it displays correctly as well. When my code proceeds to insert the rest of the layers, MATLAB gives me a black image and this error:
Error using image TrueColor CData contains element out of range 0.0 <= value <= 1.0
Can anyone help make fixes in the last section to achieve this? It's kind of mind boggling. here's the code:
function im=displayRGB(filename)
img=imread(filename);
img=im2double(img);
%%------TO CONVERT ALL PICTURES INTO A STANDARD RESOLUTION PICTURE WITH MAX DIMENSION 800------
[m n r]=size(img);
rows=1:m;
columns=1:n;
[X Y]=meshgrid(columns,rows);
if m>n
xi=linspace(1,m,800);
ratio=800/m;%this ratio is calculated so the other pixel dimension can
%be adjusted to maintain the same aspect ratio
yi=linspace(1,n,n*ratio);
[XI YI]=meshgrid(xi,yi);
else if n>m
yi=linspace(1,n,800);
ratio=800/n;
xi=linspace(1,m,m*ratio);
[XI YI]=meshgrid(xi,yi);
end
end
for panel=1:r
resized_img(:,:,panel)=interp2(X,Y,img(:,:,panel),XI,YI);
end
%%----------------EXTRACTING COLOR LAYERS..................................
R=resized_img;
R(:,:,[2 3])=0;
G=resized_img;
G(:,:,[1 3])=0;
B=resized_img;
B(:,:,1:2)=0;
%%----------INSERTING IMAGE AND COLORED LAYERS INTO ONE LARGE COMPOSITE IMAGE-----
[M N Q]=size(resized_img);
im(1:M,1:N,1:Q)=resized_img;
% figure(1)
% image(im)
im((1:M),((N+1):2*N),(1:Q))=R;
% figure(2)
% image(im)
im(((M+1):2*M),(1:N),(1:Q))=G;
% figure(3)
% image(im)
im(((M+1):2*M),((N+1):2*N),(1:Q))=B;
im=uint8(im);
figure(4);
image(im);
axis tight
axis equal
  3 Kommentare
Sumayyah Hai
Sumayyah Hai am 22 Okt. 2016
Actually I got it to display all four images on one single image as well now. I just removed the line where I converted the image type double to type uint8. This doesn't make sense to me but it somehow fixed.
There are just some blank spaces I don't understand.
Image Analyst
Image Analyst am 22 Okt. 2016
I can't see your code - you forgot to attach it - so I can't explain it to you. However did you understand my code?

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Image Processing Toolbox finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by