MATLAB: Extracting black pixels from a specific region of an image and overlaying it on another image

image editingimage overlayingimage processingImage Processing Toolboxmaskmaskingpixel extraction

I have a few images of the following nature (showing only 2 to exemplify; these are 2 separate images):
From these, I want to extract the central black image (the E or the Cross) and overlay it on other blank surfaces, like:
I cannot just extract the black pixels and overlay it, since the boundaries are also black. The size of all the images is same, 400x400x3, so, if I can get the exact pixels for the central black image (the E and the Cross), then I can just convert the corresponding pixels to black for the empty surfaces. So, is there an easy way of getting those pixels? Any help will be appreciated!

Best Answer

  • Here's the full demo for you:
    clc; % Clear the command window.
    close all; % Close all figures (except those of imtool.)
    clear; % Erase all existing variables. Or clearvars if you want.
    workspace; % Make sure the workspace panel is showing.
    format short g;
    format compact;
    fontSize = 25;
    %===============================================================================


    % Get the name of the image the user wants to use.
    baseFileName = 'o4s1_11.bmp';
    % Get the full filename, with path prepended.
    folder = pwd
    fullFileName = fullfile(folder, baseFileName);
    %===============================================================================
    % Read in a first image.
    grayImage1 = imread(fullFileName);
    % Get the dimensions of the image.

    % numberOfColorChannels should be = 1 for a gray scale image, and 3 for an RGB color image.

    [rows, columns, numberOfColorChannels] = size(grayImage1)
    if numberOfColorChannels > 1
    % It's not really gray scale like we expected - it's color.

    % Use weighted sum of ALL channels to create a gray scale image.

    % grayImage = rgb2gray(grayImage);

    % ALTERNATE METHOD: Convert it to gray scale by taking only the green channel,

    % which in a typical snapshot will be the least noisy channel.

    grayImage1 = grayImage1(:, :, 2); % Take green channel.

    end
    % Display the image.



    subplot(2, 2, 1);
    imshow(grayImage1, []);
    axis on;
    axis image;
    caption = sprintf('Image1');
    title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
    drawnow;
    hp = impixelinfo();
    % Set up figure properties:
    % Enlarge figure to full screen.
    set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, .96]);
    % Get rid of tool bar and pulldown menus that are along top of figure.
    % set(gcf, 'Toolbar', 'none', 'Menu', 'none');
    % Give a name to the title bar.
    set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off')
    drawnow;
    %===============================================================================
    % Read in a second image.
    fullFileName = fullfile(pwd, 'blankv5.bmp');
    grayImage2 = imread(fullFileName);
    % Get the dimensions of the image.
    % numberOfColorChannels should be = 1 for a gray scale image, and 3 for an RGB color image.
    [rows, columns, numberOfColorChannels] = size(grayImage2)
    if numberOfColorChannels > 1
    % It's not really gray scale like we expected - it's color.
    % Use weighted sum of ALL channels to create a gray scale image.
    % grayImage = rgb2gray(grayImage);
    % ALTERNATE METHOD: Convert it to gray scale by taking only the green channel,
    % which in a typical snapshot will be the least noisy channel.
    grayImage2 = grayImage2(:, :, 2); % Take green channel.
    end
    % Display the image.
    subplot(2, 2, 2);
    imshow(grayImage2, []);
    axis on;
    axis image;
    caption = sprintf('Image2');
    title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
    drawnow;
    hp = impixelinfo();
    % Display the histogram of the image so we can see what threshold to use.
    subplot(2, 2, 3);
    histogram(grayImage2);
    grid on;
    % Binarize the image.
    threshold = 128;
    binaryImage = grayImage1 < threshold; % Determine number from histogram.
    % Get rid of surround that is touching the border.
    binaryImage = imclearborder(binaryImage);
    % Display the image.
    subplot(2, 2, 3);
    imshow(binaryImage, []);
    axis on;
    axis image;
    caption = sprintf('Binary Image');
    title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
    drawnow;
    hp = impixelinfo();
    % Use this binary image to transfer the stuff in the second image.
    grayImage2(binaryImage) = grayImage1(binaryImage);
    % Display the image.
    subplot(2, 2, 4);
    imshow(grayImage2, []);
    axis on;
    axis image;
    caption = sprintf('Final Image');
    title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
    drawnow;