مساعدة لبحث التخرج

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

الأخ المهندس مشرف منتدى الماتلاب أشكرك على الكود الذي أعطيتني إياه في دالة DCT ولقد أفادني كثيراً لكن مشرف بحثي أصر على أن أتبع خوارزمية معينة في خطوات البرمجة ولكني واجهت بعض المشاكل في بعض الخطوات فهل بامكاني أن أكتب الخوارزمية وما قد قمت به وانتم تساعدوني في الذي لم أستطع برمجتة

ولكم جزيل الشكر

أكيد طبعا يمكنك ذلك

ومما سبق ستتم البرمجة على النحو التالي:
1:قراءة الصورة الأصلية(original image)وتحجيمها إلى 512*512 ثم تحويلها إلىgray ثم تحويلها إلى double.


%************************ original image ***************************
%read the original image and resize to 512*512 and transform to gray and
%double

org_img=imread('liftingbody.png');
org_img_resize=imresize(org_img,[512 512]);
host=im2double(org_img_resize);
%figure,imshow(host);
%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

وبما أن الصورة هي gray ولذلك لم أكتب كود التحويل إلى gray
2:قراءة صورة watermark وتحجيمها إلى 8*8 ثم تحويلها إلى binary ثم تحويلها إلى
1-domation.


%*********************** watermark image ****************************
%read the watermark image and resize to 8*8 and transform to binary and
%transform to 1-domation
water_img=imread('pout.png');
%figure,imshow(water_img);
water_img_resize=imresize(water_img,[8 8]);
water_img_binary=im2bw(water_img_resize);
[x y]=size(water_img_binary);
xy=x*y;
water_1d=reshape(water_img_binary,1,xy);
wm=water_1d;
%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

3:تقسيم الصورة الأصلية(original image) إلى blocks وحجم كل block هو 8*8 .


%dividing original image to blocks resize the each block is 8*8
d=@dct2;
t=blkproc(host,[8 8],d);

4:تحويل كل block إلى معاملات باستخدام دالة DCT2 .
5:تضمين صورة watermark داخل الصورة الأصلية original image باستخدام المعادلة التالية:

V ′ij = Vij +αWp(i, j)

بحيث أن:
V ′ij: هو الموقع الجديد الذي سيتم التضمين بداخله
Vij : هو قيمة الموقع القديم
α: رقم ثابت ولنفترض أنه 0.05
Wp(i, j) : بت من صورة watermark قد يكون 1 أو 0
6:عرض الصورة الجديدة المتضمنة للـ watermark .

وما هى المشكلة التى تواجهيها الان ؟

المشكلة هي أني أريد برمجة للخطوات من 4 إلى 6 وأرجو الاسراع لان موعد تسليم المشروع هو 10/6/2010 .

هذه الخطوات قمنا بعملها سابقا وأرسلت لكى الحل كامل بالمعادلة التى طلبتيها
وأرى الان انك استخدمتى الدالة blkproc وهذا جيد ولكن لابد من اضافة دالة تقوم بما تريدينه function handel
جربى هذا

fun = @( x ) x + 0.05 * water_img_binary;
t2 = blkproc( xx,[8 8],fun );

وأيضا ما فائدة ؟

host=im2double(org_img_resize);


فائدة الكود أنه يحول الصورة إلى double لان دالة
blkproc
لا تتعامل مع الأرقام السالبة

جربى الكود الاتى

clear
org_img = imread('liftingbody.png');
org_img_resize = imresize(org_img,[512 512]);
host = im2double( org_img_resize );
imshow(host)

water_img=imread('liftingbody.png');
water_img_resize=imresize(water_img,[8 8]);
water_img_binary=im2bw(water_img_resize);
[x y]=size(water_img_binary);
xy=x*y;
water_1d=reshape(water_img_binary,1,xy);
wm=water_1d;
figure, imshow(wm)

d1 = @dct2;
t = blkproc( host,[1 64],d1 );
fun = @( x ) x + 0.01 * wm;
t2 = blkproc( t,[1 64],fun );

d2 = @idct2;
newImage = blkproc( t2,[1 64],d2 );
figure, imshow(im2uint8(newImage),[0 255])

جزاك الله خيراً يا أخ أحمد لكن التغير الذي أريده في الصورة هو أنه سأقسم الصورة الأصلية إلى blocks وحجم كل block هو 8*8 وفي الموقع (1,1) من كل block سيتم التغيير حسب المعادلة المذكورة سابقاً لذلك أحتاج في الكود دوران
والسؤال الثاني كيف أستخدم المصفوفات
ولدي استفسار هل أستطيع أن أنقل مشروعي بعد أن أكمله في هذا المنتدى

جزاك الله خيراً يا أخ أحمد لكن التغير الذي أريده في الصورة هو أنه سأقسم الصورة الأصلية إلى blocks وحجم كل block هو 8*8 وفي الموقع (1,1) من كل block سيتم التغيير حسب المعادلة المذكورة سابقاً لذلك أحتاج في الكود دوران

الصورة الاصليه 512 فى 512 واذا تم تقسيمها الى 8 فى 8 ستكون عبارة عن 64 فى 64 بلوك
لذلك لابد ان تكون صورة العلامة المائية 64 فى 64 والموقع (1,1) فى العلامة سيكون فى الموقع (1,1) من البلوك الاول وهكذا
يعنى كل عنصر من عناصر العلامة المائية سيكون مقابل للعنصر 1,1 كل كل بلوك

وهذا سيكون غير ممكن تحقيقه او صعب جدا لانه مع استخدام blkproc لانه لا يمكن الحصول على بيانات البلوكات فلا نعرف كيف نحصل على البلوك الاول والبلوك الثانى وهكذا ولذلك ما سيتم تطبيقه للبلوك الاول سيتم تطبيقه لجميع البلوكات

وكما ذكرت سابقا بدون استخدام blkproc يمكننا عمل ذلك وارسلتك البرنامج كامل

سيتم التغيير حسب المعادلة المذكورة سابقاً لذلك أحتاج في الكود دوران

نرجو التوضيح

والسؤال الثاني كيف أستخدم المصفوفات

نرجو التوضيح السؤال عام جدا

ولدي استفسار هل أستطيع أن أنقل مشروعي بعد أن أكمله في هذا المنتدى

بالطبع يمكنك نقل مشروعك للمنتدى

السلام عليكم
أتمنى توضيح نقطة معينة إذا قسمنا الصورة الى blocks فسيكون عدد جميع الـ blocks هو 64 ولذلك نحن نغير حجم صورة العلامة الماءية إلى 8*8 بحيث أنه ينتج 64 bits وكل bit سيضاف إلى block ولكن بغض النظر عن دالة blkproc وبدون استخدامها كيف أستطيع أن اضمن صورة watermark داخل الصورة الأصلية دون أن يظهر أي تغير في الصورة الأصلية
و أول كود أعطيتني إياه نفذ العملية بنجاح لكن المشكلة هي أنه تمت اضافة bits في أكبر معامل داخل كل بلوك لكن أنا أريد التعديل يكون في هذه الجزئية فقط

% Dividing into 8x8 blocks and embed the watermark
for i = 0:8:504
   for j = 0:8:504
       [C,I1] = min( min( ic( i+1:i+8,j+1:j+8 ) ) ); % find the minimum value
       [C,I2] = min( min( ic( i+1:i+8,j+1:j+8 )') );
       I1 = I1 + j; 
       I2 = I2 + i;
       ic(I2,I1)= C + 0.5 * ig((i/8)+1,(j/8)+1); 
   end
end

بحيث أنه بدل التعديل على أكبر معامل في كل بلوك يكون التعديل على الموقع (1,1) من كل بلوك في الصورة الأصلية أي يكون داخل for تمر كل ثمان مواقع في مصفوفة الصورة لتقوم بالتعديل حسب المعادلة

V ′ij = Vij +αWp(i, j)

V’ij:يعني المعامل الجديد
Vij:المعامل القديم
α:رقم ثابت ولنفرض أنه 0.5
Wp(i,j):الbit الذي من العلامة المائية
وأتمنى أن الفكرة وضحت

هذا سيكون أسهل من ايجاد اكبر معامل
جربى الكود الاتى

% Read the orgenal image and resize to 512*512
clear
ia = imread('liftingbody.png');
ib = imresize(ia,[512 512]);
imshow (ib)
ic = dct2(ib); % The discrete cosine transform

% Read the watermark image and resize to 64*64
id = imread('liftingbody.png');
ie = imresize(ia,[64 64]);
ig = im2bw(ie);
inew = ic;
% Dividing into 8x8 blocks and embed the watermark
for i = 0:8:504
    for j = 0:8:504
        inew(i+1,j+1)= ic(i+1,j+1) + 0.5 * ig((i/8)+1,(j/8)+1); 
    end
end
newImage = idct2(inew); % The discrete cosine inverse transform
figure, imshow(newImage,[0 255]) % Scaling the new image

جزاك الله خيراً لانه فعلاً نفذ البرنامج ولكني لم أفهم لماذا كنت تقسم i على 8 ثم تضيف 1 و j على 8 ثم تضيف 1 في:

ig((i/8)+1,(j/8)+1); 

هل بإمكانك أن تشرح لي ذلك

بالنسبة لى i و j فهى تبدا من صفر حتى 504 وتزيد بمقدار 8
0 8 16 وهكذا
والصفر يقابل البيكسل الاول و 8 البيكسل الثانى و16 البيكسل الثالت
فبالقسمة على 8 واضافة واحد سيكون كالاتى 1 2 3

استخدام for loop يتيح فعالية أكثر فى الدخول الى قيم البيكسل والتحكم فيه ولكن للاسف هذا سيكون بطىء مقارنة بالدوال الجاهزة فى الماتلاب

س1:هل يعني ذلك أن هناك دوال جاهزة أنت تعرفها قد تقوم بانجاز المهمة بشكل أفضل؟
س2:إذا أردت عكس العملية يعني أن أستخرج صورة watermark من الصورة المتضمنة للـwatermark (
newImage
) كيف سيكون شكل الكود؟

س1:هل يعني ذلك أن هناك دوال جاهزة أنت تعرفها قد تقوم بانجاز المهمة بشكل أفضل؟

ليس فى هذا الموضوع ولكن كلامى كان بشكل عام

س2:إذا أردت عكس العملية يعني أن أستخرج صورة watermark من الصورة المتضمنة للـwatermark (
newImage
) كيف سيكون شكل الكود؟

بالنسبة لهذا الكود لا يمكن على الاطلاق استخراج العلامة مرة أخرى لاننا اولا
imresize وهذا يقوم بتغيير فى قيم البيكسل
dct2 والمعكوس idct2 الصورة لا ترجع كما كانت

والحل الوحيد اذا لدينا صورة ونريد معرفة هل عليها علامة ام لا ؟؟
فاننا نطبق الكود على الصورة الاصلية ونقارن النتيجة بالصورة التى لدينا فاذا كانت متماثله فنعرف ان الصورة التى لدينا مطبق عليها العلامة

لكن مشروعي يفترض أنه يجب أن يتم إستخراج صورة العلامة المائية
هل هناك كود آخر ممكن أن يضمن العلامة المائية ثم يستخرجها

يمكن ذلك ولكن بدون استخدام dct2

عندي فكرة لفك صورة العلامة المائية من الصورة الأصلية لكني لا أعرف كيف أعمل لها كود والفكرة هي:
أحول الصورة الأصلية إلى معاملات و أحول الصورة المتضمنة للعلامة المائية إلى معاملات وأقارن بين معاملات الصورتين وأقسم الصورتين إلى بلوكات حجمها 8*8 وأقارن بين المعاملات في الموقع (1,1) إذا كانت المعاملات متساوية هذا يعني أن
العلامة المائية =0
واذا لم تتسوى المعاملات في الصورتين هذا يعني ان
العلامة المائية =1
وبذلك نوجد بتات العلامة المائية ونعمل لها عرض