طلب عاجل ولكم جزيل الشكر


(مزنه) #1

السلام عليكم ورحمة الله وبركاته

احتاج مساعده بخصوص تقسيم الصوره الى 16 * 16 overlaooing block

ومن ثم عمل مقارنه

اعلم طريقة تقسيم الصوره الى بلوكات16 * 16 ولكن بلوكات عاديه وليست متداخله

الخطوات المطلوبه هي التالي :

1- Convert a color image into RGB components.
2- Divide the image into overlapping blocks.
3- Calculate relation between the blocks using color distribution

الخطوه الاولى كتبت الكود الخاص بها وهو كالتالي

close all; 
clear all; 
clc
% Clear the command window.
myimage=imread('image.jpg');
% Reading the input image 'forgery image
figure(1)
imshow(myimage)
title('forgery image')
% convert the color image in to different components 
% Red component
R = myimage(:,:,1);
image(R), colormap([[0:1/255:1]', zeros(256,1), zeros(256,1)]), colorbar; 
% Green Component
G = myimage(:,:,2);
figure;
image(G), colormap([zeros(256,1),[0:1/255:1]', zeros(256,1)]), colorbar;
% Blue component
B = myimage(:,:,3);
figure;
image(B), colormap([zeros(256,1), zeros(256,1), [0:1/255:1]']), colorbar; 
blockSizeR = 16; 
% Rows in block.
blockSizeC = 16; 
% Columns in block. 
% Divide the image into overlapping blocks 

الخطوه الثانيه والثالثه المفترض تطبيقها على كل لون الاحمر والازرق والاخضر

فهل استخدم الفنكشن التاليه

blkproc() 

ام انها تستخدم فقط مع non-overlapping

وكيف استخدمها ان كانت صحيحه

و الخطوه الثالثه حاولت كثيرا ولم اخرج بنتيجه

ارجو مساعدتي


(مزنه) #2

برجاء من لديه اجابه فليبدي مساعدته

وكان الله في عون الجميع


(Ahmed) #3

وعليكم السلام
blkproc تقسم الصورة الى بلوكات لاستخدامهم فيما بعد في دوال اخرى
اظن انها لاتعطيك البلوكات نفسها، بل فقط تقوم بتمريرها الى الدوال

مثلا

blockproc(I, [16 16], @(x) function)

تعطيك نتيجة الدالة function على البلوكات


(مزنه) #4

اشكر لك ردك و توضيحك

لكن ماهي الداله التي تقسم الصوره الى بلوكات متداخله


(Ahmed) #5

الدالة
blkproc او
blockproc
في النسخ الجديدة
هي المستخدمة عموما لانها تسهل العمل، فقط يجب معرفة التعامل معها.

اذا اردنا برمجة مخصصة يجب ان نعمل عليها بانفسنا

ملاحظة:
في معالجة الصور بماتلاب هناك نوعين من الدراسات:

- المعالجة بالجوار: اي العمل على كل بكسل حسب جيرانه
-المعالجة بالبلوك: اي تقسيم الصور الى بلوكات والعمل عليها

اذا تريد الاجابة على اسئلتك
لا اتذكر دالة مخصصة لهذا الغرض،
لكن ساعطيك كود لحل المشكل وبامكانك المواصلة وتطويره

نفرض ان الصور التي نتعامل معها من صيغة jpg

في تقسيم الصور يجب ان نحدد:

  • ابعاد البلوك
  • مقدار انزلاقه عبر الصورة “مقدار التداخل” في البعدين x و y

المشكل الذي سيواجهنا:
لما تكون ابعاد الصورة ليست من مضاعفات التداخل
سيصبح اخر بلوك ناقصا، الحل عموما هو بزيادة حجم الصورة ليتناسب مع التقسيم
انا ساستخدم
padarray
للتعامل مع هذا المشكل


(Ahmed) #6

قمت بكتابة دالة:


function [Blocks]=ImToBlocks(Bsize,Over,Image)

% Variables
Bx=Bsize(1,1);
By=Bsize(1,2);
[m n]=size(Image);
Ox=Over(1,1);
Oy=Over(1,2);

% Temp values
Tx=mod(n-Bx,Bx-Ox);
Ty=mod(m-By,By-Oy);

if Tx==0
    Px=0;
else
    Px=Bx-Ox-Tx;
end
if Ty==0
    Py=0;
else
    Py=By-Oy-Ty;
end
% New image (with padding)
In=padarray(Image,[Py Px],'replicate','post');
% New image size
[Ny Nx]=size(In);

% Block's coordinates
Cx=1:Bx-Ox:Nx-Bx+1;
Cy=1:By-Oy:Ny-By+1;

Blocks=cell(length(Cy),length(Cx));

for i=1:length(Cx)
   for j=1:length(Cy)
       Blocks{j,i}=In(Cy(j):Cy(j)+By-1,Cx(i):Cx(i)+Bx-1);
   end
end

الدالة تستخدم لتقسيم الصورة الى بلوكات متداخلة
مع القيام باضافة padding اذا وقعنا في المشكل السابق
ال padding يكون بتكرار اخر عمود على اليمين واخر سطر في الاسفل

طريقة الاستخدام:

[Blocks]=ImToBlocks(Bsize,Over,Image)

Bsize
هو حجم البلوك، يكون من الشكل

[Bx By]

Over
هو قيمة التداخل بين البلوكات، لا يجب ان يكون التداخل هو نفسه حجم البلوك.
اذا التداخل يساوي 0 معناه ان البلوكات منفصلة، وهنا
الافضل استخدام دوال اخرى جاهزة في ماتلاب.

يكون من الشكل

[Ox Oy]

Image
هي الصورة المراد تقسيمها، تكون ثنائية الابعاد، اي احدى كمبونت الصورة الاصلية.


(Ahmed) #7

مثال عن الاستخدام
بعد وضع ملف الدالة السابقة بنفس الاسم في مستند ماتلاب الرئيسي

clear all; close all;clc

I=imread('football.jpg');

[m n p]=size(I);

R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);

subplot(2,3,2);
imshow(I);
subplot(2,3,4);
imshow(R);
subplot(2,3,5);
imshow(G);
subplot(2,3,6);
imshow(B);

نطبق على احد المكونات:
“نواصل في نفس الكود”

Ox=32;  % Nbr of X overlapping pixels
Oy=32;  % Nbr of Y overlapping pixels 
Bx=64; % Block size
By=64; % Block size

[Blocks]=ImToBlocks([Bx By],[Ox Oy],R);

قمنا بتقسيم الصورة الى بلوكات 32x32 بكسل متداخلة بالنصف

لما نريد بلوك معين

Blocks{j,i}

حيث j هو السطر و i هو العمود

لو نريد رسم بعض البلوكات

[t tt]=size(Blocks);
figure
for i=1:tt
    subplot(1,tt,i)
    imshow(Blocks{3,i});
end
figure;
imshow(R)

السؤال الثالث لما يكون عندي الوقت ان شاء الله


(مزنه) #8

جدا أشكرك على الشرح الواضح

جزاك الله كل الخير و يعطيك ألف عافيه

ويارب يكون معك وقت وتساعدني بالخطوه الثالثه

ساجرب الاكواد و ساخبرك باذن الله بما يحصل معي من نتائج

اكرر لك شكري

ولك دعوة صادقه بظهر الغيب


(مزنه) #9

السلام عليكم ورحمة الله وبركاته

أستاذي الفاضل , لا نستغني عن مساعدتك

أنا جربت الكود السابق وأضفت عليه بعض التعديلات التي تناسب المطلوب مني والحمد الله اشتغل معي وطلع Run ممتاز وحسب المطلوب

بالنسبة للخطوه الثالثه :

هي حساب العلاقه بين البلوكات باستخدام color distribution

و أفضل طريقه من وجهة نظري لايجاد العلاقه و الفرق بين البلوكات لا يجاد المتشابه منها والمكرر

هو histogram

مع أنه يمكن استخدام probability distribution لكني أجدها اصعب ! ولم افلح بها بالماتلاب

لذلك المفترض اولا ايجاد histogram لكل block داخل كل مكون من مكونات الصوره R G B

و الخطوه الثالثه قسمتها لقسمين :

1- Calculate relation between the blocks using color distribution.
2- Find block-pairs having high similarity. 
   These block-pairs are the initial candidates.

بحيث بعد رسم histogram

لكل مكون , اوجد الفرق بين كل بلوك والاخر

ومن ثم أوجد الفرق بين كل بلوك والذي يليه

باي طريقه و انا اخترت
city block

B 1 & B2

B1 & B3
B 1& B4

وهكذا
B2 & B1
B2 & B3

بالنسبه للفقره الأولى من الخطوه الثالثه
كتبت الكود التالي :

[c r]=size(Blocks); for i=1:c
for j=1:r 
imhist(Block{j,i}); end
end

لكن كيف أحدد له الصوره المطلوبه

لأني كتبته بالطريقه التاليه

وخرج لي خطأ

imhist(R(Block{j,i}));

(مزنه) #10
[c r]=size(Blocks); 
for i=1:c
for j=1:r 
imhist(Blocks{j,i}); 
end
end

imhist(R(Block{j,i}));

(Ahmed) #11

السلام عليكم

قمنا بتقسيم الصورة الى 3 قنوات

قسمنا كل قناة الى بلوكات متداخلة

الان نريد البحث على العلاقة بين البلوكات
باستخدام التوزيع اللوني

يجب الانتباه للنقطة التالية

لما نتعامل مع مكونات الصورة ال 3 كل على حدى
سنهمل معلومات التوزيع اللوني
ونصبح وكاننا نتعامل مع صور منفصلة

يعني لكل بلوك،
يجب ان ناخذ بلوكاته الخاصة بالاحمر والاخضر والازرق

بمعنى اخر
كل بلوك من الصورة، سيعطينا 3 بلوكات

حساب histogram الخاص بكل بلوك يجب ان يكون ثلاثي الابعاد
لنحافظ على معلومات التوزيع اللوني

حب يقول
كل بلوك سينتج لنا ماتريكس ثلاثية الابعاد،
256 عنصر لكل بعد

مثلا
كل قيمة لها تكون من الشكل

M(x,y,z)=40

تعني انه في هذه المنطقة المختارة من الصورة
يوجد 40 بكسل قيمة الاحمر فيه تساوي x
وقيمة الاخضر تساوي y
وقيمة الازرق تساوي z

وهذا هو المعنى الحقيقي للتوزيع اللوني


(Ahmed) #12

بالنسبة لكتابة الكود
وبفرض اننا سنستخدم نفس الدالة السابقة

ندخل المتغيرات الاولية

clear all; close all;clc

I=imread('football.jpg');

[m n p]=size(I);

R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);

Ox=32;  % Nbr of X overlapping pixels
Oy=32;  % Nbr of Y overlapping pixels 
Bx=64; % Block size
By=64; % Block size

نستخدم الدالة السابقة

[RBlocks]=ImToBlocks([Bx By],[Ox Oy],R);
[GBlocks]=ImToBlocks([Bx By],[Ox Oy],G);
[BBlocks]=ImToBlocks([Bx By],[Ox Oy],B);

النتيجة هي
عدد معين من البلوكات لكل لون

للتعامل مع البلوك الاول مثلا

Rh=RBlocks{1,1};
Gh=GBlocks{1,1};
Bh=BBlocks{1,1};

الان لحساب
histogram
لهذا البلوك مثلا
نحسبه لكل كمبونت

RHist=imhist(Rh);
GHist=imhist(Gh);
BHist=imhist(Bh);

ونقوم بالجمع

HistBlock=zeros(256,256,256);
for i=1:256
    for j=1:256
        for k=1:256
           HistBlock(i,j,k)= RHist(i,1)+GHist(j,1)+BHist(k,1);
        end
    end
end

الان تحصلنا على هستوغرام التوزيع اللوني للبلوك الاول

مثلا

HistBlock(1,1,100)

ستعطينا
84

معناه ان في هذا البلوك
يوجد
84 بكسل
عندهم مستوى الاحمر 1
مستوى الاخضر 1
مستوى الازرق 100

غير منصوح برسمها
لانه سيعطل الكمبيوتر


(مزنه) #13

السلام عليكم ورحمة الله وبركاته

أستاذي الفاضل بالنسبة لرسم histogram ساتعامل مع كل قناه لوحدها دون الدمج بين التوزيع اللوني

لذلك ساكتب function و سأقوم باستدعائلها لكل قناة على حده لرسم بلوكات كل قناه

function [hist]=histBlocks(ImageBlock)

[t tt]=size(imageBlock); 
for i=1:t 
for j=1:tt imhist(imageBlock{i,j}); 
end 
end
[RHist]= histBlocks([RBlock);
[GHist]= histBlocks([GBlock);
[BHist]= histBlocks([BBlock);

(مزنه) #14

أيضا لدي سؤال : الخطوات السابقة الذكر هي طريقه لكشف تزييف الصوره

وتسمى texture description

حقيقه اود معرفة هذا المفهوم بالعربي

لاني قرأت بيبرات كثيره منشوره عن هذا الموضوع و لكن لم استطع صياغته معناه باللغه العربيه

فبودي لو عندك فكره تذكرها لي , ولك شكري سلفا


(مزنه) #15

السلام عليكم ورحمة الله

أستاذنا الفاضل لم نعتد منك التاخر في الرد والمساعده

عسى في الأمر خير ؟!!


(مزنه) #16

السلام عليكم

أستاذنا الفاضل أرجو الرد على استفساراتي ،، وان كنت أثقلت عليك


(Ahmed) #17

وعليكم السلام
عذرا لم انتبه للمشاركات الاخيرة

بالنسبة لاختيارك استخدام الهيستوغرام بشكل منفصل
انت ادرى بعملك
لكن يجب ان لا ننسى ما سبق وان قلت لك بخصوص فقدان المعلومات

بالنسبة للسؤال

كشف التزييف هو فقط احد تطبيقات
texture description

وهذا الاخير، الحق يقال ليس سهل الفهم

لانه مفهوم رياضي بحت، وصعب تمثيله على الصور في شكله النظري
الذي يدور اساسا على حساب الاحتمالات.

ساحاول تلخيص الفكرة العامة فقط

في مجال معالجة الصور (خاصة الجانب التحليلي منه)
اهم عنصرين يجب ان نعمل عليهما:

  • مخطط الصورة: اي تقريبا الشكل الهندسي لخطوطها
  • خلفية الصورة: اي ما تحويه هاته الخطوط

التحليل التقليدي للصور تقريبا يعتمد على تحويل هذين المفهومين الى معادلات رياضية.

وهذا التحليل عادة مايسبق مرحلة التقرير=القرار=الاختيار
يعني:
نحلل الصور>>نستخرج الخصائص>>نقرر

والقرار او الاختيار هو الهدف النهائي عموما للاجابة على المشكل
(مثلا هل الصورة مزيفة ام لا)

مما سبق، نقول ان التحليل هو اول خطوات المشاريع عموما
واختيار طريقة التحليل سياثر مباشرة على اي مشروع عمل

لكن، العنصرين الذي سبق ذكرهما "المخطط والخلفية"
في الصور الحقيقة ليس من السهل تحديدهما وتحويلهما الى صيغ رياضية

وهنا المشكل لما تدخل الرياضيات

نتحدث عن الجانب الذي يهمنا:
خلفية الصورة

تحويل خلفية صورة طبيعية الى معادلات رياضية
هو بالضبط ما نعنيه بال
texture description
لكن “الخلفية فقط” وليست حدودها وشكلها الهندسي

لو نرد ترجمة اكثر اكاديمية نقول انها:
تلك المنطقة التي تحوي نفس الخلفية في اتجاهات متعددة

طبعا هناك بعض الدراسات تجمع بين العنصرين الذي سبق وان ذكرتهم
اي في
texture description
تفسرها ب :الخلفية+المخطط

عموما، الخلفية تدرس من وجهتين:

  • ماكرو خلفية: اي تلك الخلفيات المكررة حسب اشكال هندسية (خلفية جدار مثلا) هنا الدراسة تكون اكثر من ناحية الشكل
  • ميكرو خلفية: الخلفية العشوائية (سطح رملي مثلا) هنا تدخل الدراسة بالاحتمالات

اهم طريقة(من وجهة نظري) تم طرحها لفهم توزيع الخلفيات
هي :
"ان الخلفية هي مجموعة عناصر تجتمع بشكل عشوائي "
العناصر تكون منظمة (ذرات الرمل مثلا) لكنها تجتمع بشكل عشوائي

كملخص، اهم طرق الدراسية للخلفيات:

  • دراسة الخلفية حسب الشكل (يدخل فيها شكل الخطوط+ شكل الخلفية)
  • دراسة الخلفية حسب التوزيع العشوائي (اي باعتبار الخلفيات موزعة بشكل عشوائي وتدرس كباقي الظواهر العشوائية)

هذه الاخيرة هي الاكثر استخداما في مجال كشف التزييف
ويستخدم فيها عموما:
التحليل بواسطة Fourier او wavelets


(إسماعيل الورافي) #18

السلام عليكم ياباش مهندس ممكن تفيدنا لو تكرمت بمجال اكتشاف الصور المزيفه انا الحين شغال على مشروع التخرج ومشروعي اكتشاف الصور المزيفه بطريقه Local Binary Patterns وفي اول هذه الطريقه الخطوات بالشكل التالي
1- ادخال الصوره وعديتها
2- تحويل الصوره الى gray-scale عديتها
3- هنا قال يريد من ضمن الخوارزميه نعمل له low pass filter للصوره بعد اي نصصم له fliterويكون الانحراف قياسه 2.0 وقياسه 5*5
هذا لم يفتهم لي