ورود

View Full Version : i-frame



zeinab 12
پنج شنبه 17 اردیبهشت 1394, 22:34 عصر
سلام.من دارم روی پروژه i-frame کار میکنم که درواقع هم روی خود کد و هم بهینه سازی کد مشکل دارم.اگر کسی بتونه کمکم کنه واقعا ممنون میشم.
این i-frame شامل مراحل زیر است:
1.خواندن یک تصویر رنگی و تبدیل به grayscale
2.شکستن تصویر grayscale به بلوکهای 8*8
3.تبدیل dct روی بلوکها
4.کوانتایز کردن ضرایب dct طبق جول کوانتایزسیون استاندارد با ضریب q=1
5.کوانتایز معکوس
6.تبدیل dct معکوس
7.تشکیل تصویر grayscale
8.نمایش تصویر grayscale اولیه به دست آمده
9.محاسبه MSE بین تصویر grayscale به دست آمده و اولیه

code:
close all
clear all
I=imread ('cameraman.tif');
J=rgb2gray(I);
I2=blkproc(J,[8 8],dct2);
Q=1;
F1=Q*round(I2,Q);
F1(1,1)=F(1,1);
G=idct2(F1);
figure;
subplot(2,2,1),imshow(J);
subplot(2,2,2),imshow(G,[0,255]);
subplot(2,2,3),imhist(J);
subplot(2,2,4),imhist(G);

rahnema1
جمعه 18 اردیبهشت 1394, 09:54 صبح
close all
clear all
img = imread ('cameraman.tif');
grayImg =double(rgb2gray(img));
DC = blkproc(grayImg, [8 8], @dct2);
zarib = 1;
Quantization_Matrix=...
[ 16 11 10 16 24 40 51 61;
12 12 14 19 26 58 60 55;
14 13 16 24 40 57 69 56;
14 17 22 29 51 87 80 62;
18 22 37 56 68 109 103 77;
24 35 55 64 81 104 113 92;
49 64 78 87 103 121 120 101;
72 92 95 98 112 100 103 99 ];
if zarib < 50
Quantization_Matrix = Quantization_Matrix * 50 / zarib ;
else
Quantization_Matrix = Quantization_Matrix * (100 - zarib) / 50;
end
Quantization_Matrix = double(uint8((Quantization_Matrix - .2) / 254.8 * 254 + 1));
quantized_DC = round(blkproc(DC, [8 8], @(x, y) x ./ y , Quantization_Matrix));
reconstructed_DC = blkproc(quantized_DC, [8 8], @(x, y) x .* y , Quantization_Matrix);
compressed_image = round(blkproc(reconstructed_DC, [8 8], @idct2));
mse =sum(( grayImg(:) - compressed_image(:)) .^ 2) / numel(grayImg);
printf("MSE = %f\n", mse)
figure;
subplot(2,2,1),imshow(grayImg,[0,255]);
subplot(2,2,2),imshow(compressed_image,[0,255]);
subplot(2,2,3),imhist(grayImg);
subplot(2,2,4),imhist(compressed_image);

zeinab 12
شنبه 19 اردیبهشت 1394, 08:56 صبح
سلام ببخشید اما میشه راجع به کدتون توضیح بدین چون من تازه شروع کردم خیلی درک بالایی از کدهاتون ندارم.ممنون:لبخند:

zeinab 12
شنبه 19 اردیبهشت 1394, 17:09 عصر
سلام میشه قسمت های زیر رو توضیح بدید؟
if zarib < 50
Quantization_Matrix = Quantization_Matrix * 50 / zarib ;
else
Quantization_Matrix = Quantization_Matrix * (100 - zarib) / 50;
end
Quantization_Matrix = double(uint8((Quantization_Matrix - .2) / 254.8 * 254 + 1));
quantized_DC = round(blkproc(DC, [8 8], @(x, y) x ./ y , Quantization_Matrix));
reconstructed_DC = blkproc(quantized_DC, [8 8], @(x, y) x .* y , Quantization_Matrix);
compressed_image = round(blkproc(reconstructed_DC, [8 8], @idct2));
mse =sum(( grayImg(:) - compressed_image(:)) .^ 2) / numel(grayImg);

rahnema1
شنبه 19 اردیبهشت 1394, 18:29 عصر
این pdf را بخونید داخلش توضیحات خوبی ارائه داده
http://www.lokminglui.com/dct.pdf
اون عبارت = quantized_DC یعنی DC / Quantization_Matrix
و عبارت = reconstructed_DC هم یعنی quantized_DC * Quantization_Matrix البته به صورت خانه های 8*8
اون = compressed_image هم که تبدیل معکوس dct هست
mse که MSE را به دست میاره!

zeinab 12
یک شنبه 20 اردیبهشت 1394, 09:29 صبح
ممنون.یک سوال دیگه هم دارم چرا وقتی تصویر رنگی رو به خاکستری تبدیل کردید با عنوان داده ای double در grayImg ذخیره کردید؟

rahnema1
یک شنبه 20 اردیبهشت 1394, 15:59 عصر
سلام
بهتره برای انجلم محاسبات ابتدا تصویر را از نوع unit8 به double تبدیل کنیم چون محدوده اعدادی که در uint8 جا می گیره بین 0 تا 255 هست که ما در محاسباتمون به عدد اعشار نیاز داریم مثل محاسبه mse یا فکر کنم یه جای دیگه

zeinab 12
سه شنبه 05 خرداد 1394, 23:32 عصر
سلام.اگر من بخوام برای ضرایب کوانتایز متفاوت mse و تصویر فشرده شده ام رو ببینم یک راهش اینه که برای تک تک ضرایب کوانتایز این کار رو انجام بدم که بهینه نیست و یکیشم اینه که یک functionتعریف کنم.
من میدونم چطور function را با یک ورودی و یک خروجی تنظیم کنم اما چطور یک ورودی (ضریب کوانتایز) بدم و دو خروجی (mseو تصویر کوانتایزشده)بخوام.
فرم تعریف functionرو ممنون میشم برام بگید.

rahnema1
سه شنبه 05 خرداد 1394, 23:48 عصر
سلام، به این صورت می تونید بنویسید البته می تونید از printf به بعد را از داخل تابع حذف کنید

function [mse compressed_image] = iframe(img, zarib)
grayImg =double(rgb2gray(img));
DC = blkproc(grayImg, [8 8], @dct2);
Quantization_Matrix=...
[ 16 11 10 16 24 40 51 61;
12 12 14 19 26 58 60 55;
14 13 16 24 40 57 69 56;
14 17 22 29 51 87 80 62;
18 22 37 56 68 109 103 77;
24 35 55 64 81 104 113 92;
49 64 78 87 103 121 120 101;
72 92 95 98 112 100 103 99 ];
if zarib < 50
Quantization_Matrix = Quantization_Matrix * 50 / zarib ;
else
Quantization_Matrix = Quantization_Matrix * (100 - zarib) / 50;
end
Quantization_Matrix = double(uint8((Quantization_Matrix - .2) / 254.8 * 254 + 1));
quantized_DC = round(blkproc(DC, [8 8], @(x, y) x ./ y , Quantization_Matrix));
reconstructed_DC = blkproc(quantized_DC, [8 8], @(x, y) x .* y , Quantization_Matrix);
compressed_image = round(blkproc(reconstructed_DC, [8 8], @idct2));
mse =sum(( grayImg(:) - compressed_image(:)) .^ 2) / numel(grayImg);
printf("MSE = %f\n", mse)
figure;
subplot(2,2,1),imshow(grayImg,[0,255]);
subplot(2,2,2),imshow(compressed_image,[0,255]);
subplot(2,2,3),imhist(grayImg);
subplot(2,2,4),imhist(compressed_image);
end

این هم نحوه استفاده

img = imread ('cameraman.tif');
[mse compressed_image] = iframe(img, 1);

zeinab 12
چهارشنبه 06 خرداد 1394, 12:17 عصر
یعنی اون mse ای که در کنار compressed_image آوردین هم mse رو میده و هم تصویر compressed_imageرو؟!!!
نباید برای برگرداندن این دومقدار دستور imshow رو بیاریم؟

rahnema1
چهارشنبه 06 خرداد 1394, 21:47 عصر
هر کدم از mse و یا compressed_image را جداگانه می تونیم استفاده کنیم
مثلا mse را چاپ کنیم یا یا compressed_image را imshow کنیم

zeinab 12
دوشنبه 11 خرداد 1394, 18:06 عصر
این اروری که در زمان اجرای برنامه متلب بهم میده چیه؟
??? Error using ==> rgb2gray>parse_inputs at 82MAP must be a m x 3 array.


Error in ==> rgb2gray at 35
X = parse_inputs(varargin{:});

rahnema1
سه شنبه 12 خرداد 1394, 00:37 صبح
rgb2gray را بردارید . احتمالا وقتی تصویر سیاه و سفید باشه ایراد می گیره