Clear Filters
Clear Filters

Image authentication using color information

1 view (last 30 days)
I am using attached script for splitting the image into 21 blocks (for Red, Green and Blue channels) and then compare each block pixel by pixel.
However, I want to do some changes as below:
1) How can I divide the image automatically into n number of equal blocks ( so I will just have to say 10 and it will divide the image into 10 equal size blocks).
2) I used isequal() function for comparison two blocks. How can I get the distance between two blocks. (Like Euclidean distance or something)
3) How to compare RGB histogram for each block. (Here I think it is possible to only compare the Y axis as X axis of the histogram will be 0 to 255 for all the blocks.) I know how to generate histogram but I dont know how to use that information for the comparison.
4) How can I keep some threshold e.g after comparison if all the blocks are matching > 98% then it is a true image OTW false image detected.
Thank you in advance.
  11 Comments
Devarshi Patel
Devarshi Patel on 10 Dec 2018
I removed the paper. Can you please help me with modifying the code that you suggested for histogram comparison? As I tried to get histogram of the sub image blocks but couldn't do it. Please help me with this.
Devarshi Patel
Devarshi Patel on 10 Dec 2018
Edited: Devarshi Patel on 10 Dec 2018
If you dont have enough time can you at least show me how to get the histogram of each block in blocks 1 and blocks 2 generated by:
clear
clc
%inputs:
% img: an image (2D or 3D numeric array)
% M, N: the number of blocks along the rows, columns respectively
%output:
% block: a M x N cell array of 2D or 3D numeric arrays
img1 = imread('w.png');
M = 3;
N = 7;
blocks1 = mat2cell(img1, ones(1, M) * size(img1, 1) / M, ones(1, N) * size(img1, 2) / N, size(img1, 3)); %will error if M and N are not divisors of H and W
% second image
img2 = imread('b.png');
M1 = 3;
N1 = 7;
blocks2 = mat2cell(img2, ones(1, M1) * size(img2, 1) / M1, ones(1, N1) * size(img2, 2) / N1, size(img2, 3)); %will error if M and N are not divisors of H and W
%inputs:
% blocks1: blocks of 1st image. M x N cell array of 2D or 3D numeric arrays
% blocks2: blocks of 2nd image. Same size as blocks1
%outputs:
% comparison: a M X N double array of euclidean distance between each matching block.
comparison = cellfun(@(b1, b2) sqrt(sum((b1(:) - b2(:)) .^2)), blocks1, blocks2)
This will be very helpful Please help me with this.

Sign in to comment.

Accepted Answer

Guillaume
Guillaume on 4 Dec 2018
1. Dividing an image of size HxW into MxN blocks where M and N are divisors of H and W respectively:
%inputs:
% img: an image (2D or 3D numeric array)
% M, N: the number of blocks along the rows, columns respectively
%output:
% block: a M x N cell array of 2D or 3D numeric arrays
blocks = mat2cell(img, ones(1, M) * size(img, 1) / M, ones(1, N) * size(img, 2) / N, size(img, 3)); %will error if M and N are not divisors of H and W
2. It seems to me that you haven't defined your comparison metric. You probably need to do some research on what it should be. Once you've defined that, it's easy to perform the comparison. Here, I'm using the square root of the sum of the square of the differences between corresponding pixels of each block. I have no idea if it is a good metric, as it's not my field:
%inputs:
% blocks1: blocks of 1st image. M x N cell array of 2D or 3D numeric arrays
% blocks2: blocks of 2nd image. Same size as blocks1
%outputs:
% comparison: a M X N double array of euclidean distance between each matching block.
comparison = cellfun(@b1, b2) sqrt(sum((b1(:) - b2(:)) .^2)), blocks1, blocks2)
3. Again, making the comparison is trivial but you need to define a metric first.
  11 Comments
Guillaume
Guillaume on 6 Dec 2018
As I said it's not my domain. However, I'm sure you can find plenty of reliable methods in the plethora of papers that have been written on the subject.
Devarshi Patel
Devarshi Patel on 6 Dec 2018
I will go through some papers for that.
Another thing I am confuse about is how is euclidean distance formula "comparison = cellfun(@(b1, b2) sqrt(sum((b1(:) - b2(:)) .^2)), blocks1, blocks2)" is working in my case as each pixel has 3 value (R,G and B) specifically how it is taking the diffrence and coming up with the single number. Maybe it is sill question but I am not understanding it. I tried going through the cellfun discription. Any explanation will be appreciated.

Sign in to comment.

More Answers (2)

Image Analyst
Image Analyst on 7 Dec 2018
Maybe you should just try ro register the images with imregister() and then use immse() and ssim().
Or you could also use Hu's moments
Or any of the feature matching things in the Computer Vision System Toolbox.
  3 Comments
Image Analyst
Image Analyst on 7 Dec 2018
There are so very many things that could possibly be measured. For one, you could just compute the RGB histograms of each image. Better, why don't you look up forgery or forensics in VisionBibliography and you'll find lots of algorithms. Pick one or two and code them up:
Devarshi Patel
Devarshi Patel on 7 Dec 2018
I tried looking into few papers but none of them are helpful for writing a MATLAB code (may be because I am new and know very little coding). I will investigate it more. Thank you for your suggestion.If any particular code (which considers colors as well as structural features for image comparison) comes to your mind please let me know as database have thousands of papers.

Sign in to comment.


Devarshi Patel
Devarshi Patel on 19 Dec 2018
Hi Guillaume & Image Analyst,
Thank you for your answers so far I have just last question after that I will Accept the answer. Attached images are same images and taken in same condition but still when you compare 2 images it shows larger distance. Can you give me any suggestions how to solve this ? Is there any way of preprocessing to match the images? like thresholding or removing the noise or something similar

Products


Release

R2018b

Community Treasure Hunt

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

Start Hunting!