بهینه سازی هیستوگرام با تابع توزیع تجمعی
تابع توزیع تجمعی یا cdn که از واژهی Cumulative distribution function میآید در بحث بهینهسازی هیستوگرام کاربرد خوبی دارد؛ در این نوشته با کمک تابیع توزیع تجمعی تصویر ورودی خود را که یک تصویر تاریک است با بهینهسازی هیستوگرام در متلب روشن و قابل دیدن میکنیم.
بهینه سازی هیستوگرام با تابع توزیع تجمعی
تصویر ورودی ما تصویر زیر می باشد:

کد بهینه سازی هیستوگرام با متلب
clc;
close all;
clear all;
img1 = imread('histogram.jpg');
img2 = img1;
pixel_histogram = zeros(1, 256);
pixel_cdf = zeros(1, 256);
pixel_new_value = zeros(1, 256);
for i = 1 : 563
for j = 1 : 1000
pixel_histogram(1, img1(i,j) + 1) = pixel_histogram(1, img1(i,j) + 1) + 1;
end
end
pixel_cdf(1, 1) = pixel_histogram(1, 1);
min_cdf = pixel_histogram(1, 1);
max_cdf = pixel_histogram(1, 1);
for k = 2 : 256
pixel_cdf(1, k) = pixel_cdf(1, k - 1) + pixel_histogram(1, k);
if( pixel_cdf(1, k) > max_cdf )
max_cdf = pixel_cdf(1, k);
end
if( pixel_cdf(1, k) < min_cdf )
min_cdf = pixel_cdf(1, k);
end
end
for k = 1 : 256
pixel_new_value(1, k) = round( ( ( pixel_cdf(1, k) - min_cdf ) / ( max_cdf - min_cdf ) ) * 255 );
end
for i = 1 : 563
for j = 1 : 1000
img2(i,j) = pixel_new_value(1, img1(i,j) + 1);
end
end
imshow(img1);
figure, imshow(img2);
نتیجه نهایی بهینه سازی هیستوگرام

برای مطالعهی محتوای بیشتر در ارتباط با متلب روی این لینک کلیک کنید. نظرات خود را برای ما بنویسید.
برای امتیاز به این نوشته کلیک کنید!
[کل: 1 میانگین: 5]



















آیا این نگاشت برای تصاویر پزشکی یا ماهوارهای هم مناسب هست یا باید محدودتر اعمال بشه؟
این روش به طور کلی برای بهبود کنتراست تصاویر کاربرد دارد، اما برای تصاویر پزشکی و ماهوارهای که اطلاعات دقیق و ظریف اهمیت بالایی دارند، ممکن است نیاز به رویکردهای تخصصیتر و محدودتری باشد.
بعد از equalization، مقایسهٔ بصری با قبل و بعد رو با هیستوگرامها هم نمایش دادید؟
سلام. در حال حاضر مقایسه بصری با هیستوگرامها انجام نشده، اما در آینده حتماً این مورد را در نظر خواهیم گرفت.
اگر تصویر خیلی نویزی باشه، قبل از equalization پیشپردازش خاصی پیشنهاد میکنید؟
سلام. بله، استفاده از فیلترهای کاهنده نویز مانند فیلتر میانه (median filter) قبل از هیستوگرام اکولایزیشن میتواند نتایج بهتری به همراه داشته باشد.
برای تصاویر رنگی، همین روش رو روی هر کانال جدا انجام میدید یا به فضای دیگری مثل HSV میبرید؟
برای تصاویر رنگی، معمولاً این روش را روی هر کانال رنگی (قرمز، سبز، آبی) به صورت جداگانه اعمال میکنند.
چرا اندازه تصویر رو در کد بهصورت ثابت ۵۶۳×۱۰۰۰ قرار دادید و از size استفاده نکردید؟
سلام. در این مثال برای سادگی و نمایش بهتر الگوریتم، ابعاد تصویر را ثابت در نظر گرفتیم، اما در پروژههای واقعی استفاده از تابع `size` برای انعطافپذیری بیشتر توصیه میشود.
آیا استفاده از cumsum بهجای حلقه برای محاسبهی CDF سرعت را افزایش نمیدهد؟
بله، کاملاً درست است. استفاده از تابع `cumsum` در متلب برای محاسبهی CDF، به دلیل بهینهسازیهای داخلی متلب، میتواند سرعت اجرای کد را به طور قابل توجهی افزایش دهد.
چرا مقدار اولیهی min_cdf را برابر با اولین مقدار هیستوگرام قرار دادهاید و نه یک مقدار غیر صفر؟
سلام، مقداردهی اولیه min_cdf با اولین مقدار هیستوگرام برای این است که در محاسبهی مقادیر مینیمم و نرمالسازی، از همان ابتدا یک نقطه مرجع داشته باشیم. این کار باعث میشود که محاسبات به درستی انجام شوند.
اگر تصویر ورودی خیلی روشن باشد، آیا همین الگوریتم باعث افت کیفیت نمیشود؟
با سلام، بله، اگر تصویر ورودی خیلی روشن باشد، این الگوریتم میتواند باعث کاهش کنتراست و افت کیفیت شود. در این موارد، ممکن است نیاز به روشهای دیگری برای بهینهسازی هیستوگرام باشد.
تفاوت خروجی این پیادهسازی با دستور آمادهی histeq در متلب چهقدر محسوس است؟
با سلام، پیادهسازی دستی شما در این پست، درک عمیقتری از فرآیند بهینهسازی هیستوگرام را فراهم میکند، در حالی که histeq یک راهحل سریعتر و بهینه شده برای این کار است. تفاوت خروجیها ممکن است جزئی باشد، اما هدف اصلی این پست، آموزش گام به گام این فرآیند است.
آیا این روش هیستوگرام مساویسازی برای تصاویر رنگی هم قابل استفاده است یا فقط خاکستری جواب میدهد؟
با سلام، این روش به طور مستقیم برای تصاویر خاکستری طراحی شده است. برای تصاویر رنگی، باید این فرآیند را برای هر کانال رنگی (مثل RGB) به صورت جداگانه انجام دهید.