function psnr_value = PSNR(A, B)
%PSNR محاسبه نسبت اوج سیگنال به نویز (PSNR) بین دو تصویر را محاسبه می کند.
% PSNR_VALUE = PSNR(A, B) مقدار PSNR بین تصاویر A و B را بر حسب دسی بل (dB) برمی گرداند.
% A و B باید تصاویر شدت MATLAB با مقادیر پیکسل در محدوده [0، 1] باشند.
% برای تصاویر با 256 سطح خاکستری، مقادیر پیکسل را به محدوده [0، 1] نرمال کنید
% قبل از استفاده از این تابع (به عنوان مثال، با تقسیم بر 255).
% بررسی اینکه آیا ورودی ها تصاویر معتبری هستند یا خیر
if ~isa(A, 'double') || ~isa(B, 'double')
error('تصاویر ورودی باید از نوع double باشند.');
end
if any(A(:) < 0) || any(A(:) > 1) || any(B(:) < 0) || any(B(:) > 1)
error('مقادیر پیکسل تصویر ورودی باید در محدوده [0، 1] باشد.');
end
% محاسبه میانگین مربع خطا (MSE)
mse = mean((A(:) - B(:)).^2);
% رسیدگی به موردی که MSE صفر است (تصاویر یکسان)
if mse == 0
psnr_value = Inf; % یا یک عدد بسیار بزرگ، مانند 100
return;
end
% محاسبه PSNR
max_pixel_value = 1; % از آنجا که تصاویر به [0،1] نرمال شده اند
psnr_value = 10 * log10((max_pixel_value^2) / mse);
end
ترجمه و توضیحات جامع
تابع PSNR(A, B) برای محاسبه نسبت اوج سیگنال به نویز (PSNR) بین دو تصویر A و B استفاده میشود. PSNR یک معیار رایج برای ارزیابی کیفیت تصاویر، به ویژه در مقایسه تصویر اصلی با یک تصویر تغییر یافته (مانند تصویر فشرده یا نویزدار) است.
ورودیها
- A: تصویر اول (اصلی یا مرجع). باید یک تصویر شدت MATLAB با مقادیر پیکسل در محدوده [0، 1] باشد.
- B: تصویر دوم (تغییر یافته یا مورد مقایسه). باید یک تصویر شدت MATLAB با مقادیر پیکسل در محدوده [0، 1] باشد.
خروجی
- psnr_value: مقدار PSNR بین دو تصویر بر حسب دسی بل (dB).
توضیحات
-
بررسی ورودی: ابتدا بررسی میشود که آیا ورودیها تصاویر معتبری هستند یا خیر. برای این منظور، نوع داده ورودیها بررسی میشود (باید
doubleباشد) و همچنین محدوده مقادیر پیکسلها (باید بین 0 و 1 باشد). در صورت وجود هرگونه مشکل، یک پیام خطا نمایش داده میشود. -
محاسبه MSE: میانگین مربع خطا (MSE) بین دو تصویر محاسبه میشود. MSE نشان میدهد که چقدر پیکسلهای دو تصویر با یکدیگر تفاوت دارند. هرچه MSE کمتر باشد، تصاویر مشابهت بیشتری دارند.
-
بررسی MSE صفر: اگر MSE صفر باشد، به این معنی است که دو تصویر کاملاً یکسان هستند. در این حالت، PSNR بینهایت در نظر گرفته میشود (زیرا تقسیم بر صفر خواهیم داشت).
-
محاسبه PSNR: در نهایت، PSNR با استفاده از فرمول زیر محاسبه میشود:
PSNR = 10 * log10((MAX_pixel_value^2) / MSE)
در اینجا MAX_pixel_value حداکثر مقدار پیکسل در تصویر است که در این حالت 1 در نظر گرفته شده است (زیرا تصاویر به محدوده [0، 1] نرمال شدهاند).
نحوه استفاده
- نرمالسازی (در صورت نیاز): اگر تصاویر شما دارای مقادیر پیکسل در محدوده [0، 255] هستند (مانند تصاویر grayscale معمولی)، ابتدا باید آنها را به محدوده [0، 1] نرمال کنید. برای این کار، کافی است مقادیر پیکسلها را بر 255 تقسیم کنید :
A = double(A) / 255;
B = double(B) / 255;
- فراخوانی تابع: سپس میتوانید تابع
PSNRرا با تصاویر نرمال شده فراخوانی کنید :
psnr_result = PSNR(A, B);
disp(['PSNR: ', num2str(psnr_result), ' dB']);
نکات مهم
- PSNR یک معیار ساده و پرکاربرد است، اما ممکن است همیشه با کیفیت بصری تصویر همخوانی نداشته باشد. به عنوان مثال، دو تصویر میتوانند PSNR یکسانی داشته باشند، اما از نظر بصری متفاوت به نظر برسند.
- مقادیر PSNR معمولاً بین 20 تا 50 دسی بل هستند. هرچه PSNR بیشتر باشد، کیفیت تصویر بهتر است.
این توضیحات جامع و دقیق به شما کمک میکند تا به طور کامل با تابع PSNR و نحوه استفاده از آن آشنا شوید.
