Add two images in MATLAB w/o resizing image - matlab

Running this code gives me an error that I cannot fix. How can I solve this without resizing the original image and still add that 2 images?
a = imread('sample1.jpg');
b = imread('sample2.jpg');
c = imadd(a, b);
imshow(c);
I'm getting the following error
enter image description here

Related

Difference in image superimposition achieved with MATLAB function imfuse and that using ImageJ composite image

I have two time-lapse images of a membrane surface. Both images were supposed to show the same region. But while adjusting focus, captured field might have drifted a bit. I used two routes to visualize the amount of drift - MATLAB v 2021a and ImageJ. With MATLAB, first I tried superimposing two images using imshowpair. Original grayscale images are fix
and mov. imshowpair(mov,fix) yields imshowpair_comp. It clearly shows possible drift. Then I tried using imfuse function as follows:
RF = imref2d(size(fix));
RM = imref2d(size(mov));
RM.XWorldLimits = RF.XWorldLimits;
RM.YWorldLimits = RF.YWorldLimits;
comp = imfuse(fix,RF,mov,RM,'falsecolor','Scaling','joint','ColorChannels',[1 2 0]);
It gave the composite image imfuse_comp. Next, I carried out image registration and I got imregcorr_comp.
tForm = imregcorr(mov,fix,"similarity");
movTransform = imwarp(mov,tForm,"OutputView",RF);
imshowpair(movTransform,fix)
This image shows properly aligned composite image. I tried doing the same using ImageJ.
Open fix.tiff in ImageJ. Image->Colors->Channels Tool->Composite->Red.
Open mov.tiff in ImageJ. Image->Colors->Channels Tool->Composite->Green.
Image->Colors->Merge Channels
This gave the composite image imagej_comp. This composite image obtained from ImageJ clearly shows that there was no misalignment in the two images to begin with!
I am unable to figure out where I went wrong. Now I am really confused between two routes - and which route to believe in. Can someone please help me out?
Thanks!

Adding Color Maps to images in MATLAB

This is a fairly entry-level question but I could not find the answer to it here on SO or on Mathworks help.
I want to add a color bar to an image I am loading and then save the image along with the created color bar.
The result I am looking for is like figure 1 on this page except that there is an image instead of the plot and the color bar shows the range of intensities in the image.
The page made me think that running
colorbar(<trarget matrix>);
Would do the trick but that throws an error when I try to apply it to an image.
So my question is, how do I make a color bar for my image and once made what would be a good way to concatenate the two for saving.
I am loading the image using the following snippet
IMGpath = 'barbaraSmall.png';
im = imread(IMGpath, 'png');
%
%colorbar(im); >>Throws an error
imshow(im);
imwrite(im, 'barabara_withMAP.png', 'png');
The syntax that you're using is colorbar(target). According to the documentation,
target is:
"Target for the colorbar, specified as an Axes object, a PolarAxes object, or a graphics object that has a ColorbarVisible property".
You're inputting an image matrix (im) as target which is none of the above mentioned objects. You can simply just enter:
colorbar;
or if you want to give an axes' handle then:
colorbar(gca);
You can save the result using saveas.
saveas(gca, 'barabara_withMAP.png')

How do I save images with face detection bounding box using the Batch Image Processor app in Matlab

I'm a newbie to Matlab and I'm trying to perform face detection on a batch of images. I'm using this simple face detection code which works with the Image Processing Toolbox and the Computer Vision Toolbox. I'm using the Batch Image Processor App and wrote my code as a function that I apply to a batch of images. What I need as an outcome are the four values of each bounding box (this works), and I want to save each image with the bounding box drawn, in order to check if the face is detected correctly (which doesn't work). This is the function:
function results = facedetection(im)
FDetect = vision.CascadeObjectDetector('FrontalFaceLBP','MergeThreshold', 5);
BBface = step(FDetect,im);
figure,
imbb = imshow(im); hold on
for i = 1:size(BBface,1)
rectangle('Position',BBface(i,:),'LineWidth',2,'LineStyle','-
','EdgeColor','r');
end
hold off;
imwrite(imbb,'test.jpg'); %this is the line that doesn't work
results.face=BBface; %this gives me the values of each bounding box
end
When I apply this function it provides me with the values of the bounding box, and in the imshow it shows the image with the bounding box around the face. However, the imwrite function doesn't work and gives the following error:
Error using imwrite (line 420) Expected DATA to be one of these types:
numeric, logical
Instead its type was matlab.graphics.primitive.Image.
Error in facedetection (line 13) imwrite(imbb,'test.jpg');
Does anyone know how to solve this issue? Is it possible to save all images with the bounding box using the Batch Image Processor app and if so, how? Is it also possible to save the images without using imshow? I don't have to see the results directly, as long as I can save them.
I'm sorry if this question is too vague, but I hope someone can help me a bit further.
EDIT: I found out that the Batch Image Processor can be used to save the images, as long as the image is put into a results. string in the function (see documentation), but I don't know how to do this. I changed my code as followed:
function results = facedetection(im)
FDetect = vision.CascadeObjectDetector('FrontalFaceLBP','MergeThreshold', 5);
BBface = step(FDetect,im);
figure,
imbb = imshow(im); hold on
for i = 1:size(BBface,1)
rectangle('Position',BBface(i,:),'LineWidth',2,'LineStyle','-
','EdgeColor','r');
end
hold off;
BBimage = imfuse (im, BBface); %this doesn't work
results.BBValues=BBface;
results.BBimage=BBimage;
end
This code returns a complete green hued image (?!). So probably something goes wrong in the imfuse part. How do I put the im and the drawn rectangle together in the BBimage?
I solved the problem using the insertShape function. The complete function becomes as follows:
function results = facedetection(im)
FDetect = vision.CascadeObjectDetector('FrontalFaceLBP','MergeThreshold', 3);
BBvalues = step(FDetect,im);
hold on
for i = 1:size(BBvalues,1)
BBimage = insertShape (im,'rectangle',BBvalues(i,:),'Color','yellow');
end
hold off;
results.Values3=BBvalues;
results.Image3=BBimage;
end
When this function is applied to a batch of images in the Batch Image Processor app, the 'export results of all processed images to files'-button allows you to save the images including the bounding box rectangle. It saves each image with its original filename and an additional '_Image3'.
I'm using this code now to test the most effective threshold, which is why I named them Values3 and Image3 refering to the threshold 3. It works fine!
This means that imbb that you are trying to write out to a file is not the proper type to write out to a file.
Can you try something like this after your for loop and see what happens?
frame = getframe(figure);
image = frame2im(frame);
imwrite(image, 'test.jpg');
Eventually, you want to move your imwrite inside your for loop so you can batch process it.
You would declare a file name before the for loop like :
basename = 'MyFileName-';
Then inside the for loop, you would do something like
filename = [basename, num2str(i)];
imwrite(image, filename);

Lock image size on Matlab GUI

I'm making a GUI in MatLab that asks the user to upload a video file.
Next I want to play it in axes with a fixed window size . However, if the uploaded file is large, Matlab will expand the axes and take over most of my GUI. Is there a way to shrink the image to make it fit the axes?
Does anyone know how to solve this?
Usually Matlab axes are not supposed to change their position if the image is too big.
I can think of two possible problems:
The axes were large from the beginning, but showed small image with margins if the image is small enough
The command of showing the image that you are using is custom and it changes the axes size.
This question is old, but I stumbled across this (looking for something else) so perhaps it will help someone to see what I did.
I wanted to resize pretty large images (1024x 100k-200k pixels) so that my GUI can quickly demonstrate various color operations on a view of these large data sets. I just manually sub-sampled my data as follows (functions below).
Note that this example is an image. To spatially sub-sample a video, I have looped through the video and done something similar in the past on each frame.
[plotWidthPixels, plotHeightPixels] = getPlotAreaPixels(handles.figure1, handles.axes1);
[nSamplesPerLine nLines] = size(iqData);
colInds = decimateToNumber(nLines,plotWidthPixels);
rowInds = decimateToNumber(nSamplesPerLine,plotHeightPixels);
iqDataToPlot = iqData(rowInds,colInds);
First, I got the axis size in pixels:
function [plotWidthPixels, plotHeightPixels] = getPlotAreaPixels(figHandle, axisHandle)
set(figHandle,'Units','pixels')
figSizePix = get(figHandle,'Position');
set(axisHandle,'Units','normalized')
axSizeNorm = get(axisHandle,'Position');
axisSizePix = figSizePix.*axSizeNorm;
plotWidthPixels = ceil(axisSizePix(3)-axisSizePix(1));
plotHeightPixels = ceil(axisSizePix(4)-axisSizePix(2));
Then I used that to decimate the width and height of my image by getting sub-sets of indices that are (crudely approximately) evenly spaced:
function inds = decimateToNumber(lengthOfInitialVector, desiredVectorLength, initialIndex)
if nargin < 3
initialIndex = 1;
end
if (lengthOfInitialVector-initialIndex+1) > desiredVectorLength*2
inds = round(linspace(initialIndex,lengthOfInitialVector,desiredVectorLength));
else
inds = initialIndex:lengthOfInitialVector;
end

Image processing Error in MATLAB

I was given a defined set of images (.png), I am supposed to detect each images Edges, then apply some image processing, but I have a problem.
First I an image array as follows :
imgArray = {'image_1.png','image_2.png','image_3.png'}
Then applied edging (sobel), using the MATLAB built in function edge so :
for i = 1:3
image=imread(imgArray{i});
image = edge(image,'sobel');
imgArray{i} = image;
end
based on that prvious code and my understanding, that the imageArray, now contains all 3 edged images.
Later on, I need to use the Edged images using that command image=imread(imgArray{i}); in a different place in the code, but it gives me an Error, I dont understand why does that happen ??
EDIT:
Here's the error I'm getting:
Error in ==> ImageCompare at 43 image=imread(imgArray{i});
imgArray = {'image_1.png','image_2.png','image_3.png'};
imgArrayEdged = strrep(imgArray, '.png', '_edged.png');
for i = 1 : length(imgArray)
image = imread(imgArray{i});
image = edge(image,'sobel');
imwrite(image, imgArrayEdged{i});
end
% later...
for i = 1 : length(imgArray)
if (your_condition)
image = imread(imgArray{i});
else
image = imread(imgArrayEdged{i});
end
end
Your imgArray contains file names as strings. In your loop, you are reading the image files and replacing each string in the cell array with image data.
If you absolutely require the file name strings later, you must create a second variable to hold the image data itself. If you only require the original images, just don't use imread later in the code!
Having read in an image file with imread once, there is no reason to waste time by reading the files again. It seems like you aren't quite aware of what state your data is in as it moves through your code. I suggest you use MATLAB's excellent debugger to step through and examine the type and content of the variables - you will quickly see where imread, which needs a file name, is inappropriate.