ورود

View Full Version : مشکل در پیاده سازی فرمول پردازش تصویر



nina222
یک شنبه 26 بهمن 1393, 23:16 عصر
سلام
من در پیاده سازی این 3 فرمول که مربوط می شه به بحث histogram equalization و تصاویرش در این پست ضمیمه شده به مشکل بر خوردم

البته فرمول 1و2 رو پیاده سازی کردم به این صورت.



hnorm=imhist(f)./numel(f);
cdf=cumsum(hnorm);


ولی تو فرمول 3 نمی دونم چه طور باید T,Tmin رو محاسبه کنم و نگاشت رو انجام یدم.

دوستان عزیز اگر راهنمایی بفرمایید ممنون می شم.:خجالت:

ehsan_faal
دوشنبه 27 بهمن 1393, 00:53 صبح
عکسا خیلی ریزن. اصلا واضح نیست.

nina222
دوشنبه 27 بهمن 1393, 01:27 صبح
عکسا خیلی ریزن. اصلا واضح نیست.

عذر خواهی می کنم اشتباه شده بود. عکسها رو ضمیمه کردم:اشتباه:

reza_noei
دوشنبه 27 بهمن 1393, 05:51 صبح
سلام
من در پیاده سازی این 3 فرمول که مربوط می شه به بحث histogram equalization و تصاویرش در این پست ضمیمه شده به مشکل بر خوردم

البته فرمول 1و2 رو پیاده سازی کردم به این صورت.



hnorm=imhist(f)./numel(f);
cdf=cumsum(hnorm);


ولی تو فرمول 3 نمی دونم چه طور باید T,Tmin رو محاسبه کنم و نگاشت رو انجام یدم.

دوستان عزیز اگر راهنمایی بفرمایید ممنون می شم.:خجالت:

این فرمول برای بهبود تصاویریه که شدت نور نامناسبی دارند.
ایده این فرمول توزیع کردن رنگهای یک عکس در بازه 0 - 255 است.
اگر به هیستوگرام تصاویر سیاه سفید با شدت نور زیاد و یا کم نگاه کنید میبیتید که تجمع رنگهای روشن یا تیره در یک یازه
بسیار زیاده و بازه مقادیر خیلی کوچکتر از 255 است یعتی مثلا کل رنگهای تصویر در بازه 100 تا 255 (برای یک تصویر روشن نامناسب)
قرار دارند. حال ما اگر این ستون های رنگ رو در کل بازه توزیع کنیم به طوری که بازه جدبد 0 تا 255 بشود عمل بهبود کیفیت انجام میشود.

به این ترتیب که برای تصاویر سیاه و سفید (gray scale) یک آرایه 255 تایی درست میکنید بعد تک تک پیکسل های عکس ورودی رو میخونید
و خونه متناظرش در آرایه رو یک واحد افزایش میدهید مثلا اگر مقدار پیکسل فعلی 100 بود به خانه 100 ام آرایه یک واحد اضافه میکنید.
T[Image[x,y]=T[Image[x,y]+1;

طبیعا x و y دو حلقه هستند که تصویر رو پیمایش میکنند.
به این ترتیب جدول توزیع تجمعی بدست میاد که در اون تعداد تکرار هر رنگ تو تصویر در یکی از عنصرهای آرایه ذخیره شده.

حال باید محل جدید یک مقدار را بگونه ای پیدا کنیم که توزیع ما در بازه 0 - 255 قرار گیرد. برای انجام این کار از فرمول موجود استفاده میکنیم.
Tmin حداقل مقداریه که در آرایه T وجود داره برای پیدا کردن این مقدار باید یک حلقه بنویسید از صفر شروع بشه. به اولین خانه غیر صفر در T که
رسید شماره آن خانه میشود حداقل مقداری که در بین رنگ های عکس مورد نظر داریم.

در انتها میگوییم رنگ خانه x و y میشود تعداد تکرار آن رنگ منهای Tmin تقسیم بر 1 منهای Tmin کل عبارت ضربدر 254 و حاصل بعلاه 0.5 و طبق قرمول
با تبدیل به int اعشار عدد رو حذف میکتیم.

rahnema1
دوشنبه 27 بهمن 1393, 07:23 صبح
سلام
این مربوط به سه تا فرمول
فقط یک بخش باقی مونده که اون هم جایگزینی مقادیر تصویر با هیستوگرام تعدیل شده هست

img = imread('G.tif');
img = double(img);
L= 255
x= 0:L;
h = hist(img (:), x);
iTmin = find(h > 0 , 1);
hnorm=h ./ numel(img);
Tmin = hnorm(iTmin);
CDF=cumsum(hnorm);
TCDF = uint8((CDF - Tmin) .* (L - 1) ./ (1 - Tmin) + 0.5);

nina222
دوشنبه 27 بهمن 1393, 11:45 صبح
سلام
این مربوط به سه تا فرمول
فقط یک بخش باقی مونده که اون هم جایگزینی مقادیر تصویر با هیستوگرام تعدیل شده هست

img = imread('G.tif');
img = double(img);
L= 255
x= 0:L;
h = hist(img (:), x);
iTmin = find(h > 0 , 1);
hnorm=h ./ numel(img);
Tmin = hnorm(iTmin);
CDF=cumsum(hnorm);
TCDF = uint8((CDF - Tmin) .* (L - 1) ./ (1 - Tmin) + 0.5);

سلام مهندس
متشکرم. به نظر شما این قسمت


iTmin = find(h > 0 , 1);

نباید بشه؟



iTmin = find(h < 0 , 1);

ببخشید اگه سئوالم خیلی ابتدایی هست.

و این که خط 8 رو متوجه نشدم.
مرسی

nina222
دوشنبه 27 بهمن 1393, 12:12 عصر
سلام مهندس
متشکرم. به نظر شما این قسمت


iTmin = find(h > 0 , 1);

نباید بشه؟



iTmin = find(h < 0 , 1);

ببخشید اگه سئوالم خیلی ابتدایی هست.

و این که خط 8 رو متوجه نشدم.
مرسی
من جای < از > استفاده کردم خطا داد مهندس فکر کنم درست فرموده بودید.
اینم کد نهاییم به نظر شما درست هست؟


img = double(img);
L= 255;
x= 0:L;
h = hist(img (:), x);
iTmin = find(h > 0 , 1);
hnorm=h ./ numel(img);
Tmin = hnorm(iTmin);
CDF=cumsum(hnorm);
TCDF = uint8((CDF - Tmin) .* (L - 1) ./ (1 - Tmin) + 0.5);
for i=1:size(img,1)

for j=1:size(img,2)

s(i,j)=TCDF(img(i,j)+1);

end

end
imshow(s);
):لبخندساده:

rahnema1
دوشنبه 27 بهمن 1393, 13:12 عصر
عالی بود :تشویق: مخصوصا s(i,j)=TCDF(img(i,j)+1);

البته اگه بخواهیم سریعتر بشه میتونیم حلقه را حذف کنیم و فقط به جاش اینجور بنویسیم
s = TCDF(img + 1);

nina222
دوشنبه 27 بهمن 1393, 13:36 عصر
عالی بود :تشویق: مخصوصا s(i,j)=TCDF(img(i,j)+1);

البته اگه بخواهیم سریعتر بشه میتونیم حلقه را حذف کنیم و فقط به جاش اینجور بنویسیم
s = TCDF(img + 1);
مرسی
در مورد > یا< می شه لطفا راهنمایی بفرمایید و خط 8 کدتون؟ متشکرم

rahnema1
دوشنبه 27 بهمن 1393, 13:47 عصر
در عکس سوم گفته smallest value
منظورش اینه که کمترین مقداری که در تصویر وجود داره را باید پیدا کنیم
یک تصویر 8 بیتی میتونه از صفر تا 255 بگیره اما ممکنه کمترین مقدار تصویر صفر نباشه مثلا 25 باشه که ما اون مقدار را میخواهیم
با استفاده از find در هیستوگرام جستجو می کنیم که محل کمترین مقدار تصویر را پیدا کنیم
مثلا فرضا کمترین مقدار برابر 25 باشه مقدار هیستوگرام برای 0 تا 24 برابر صفر هست و مثلا برای 25 برابر با تعداد پیکسلهایی که مقدارشون 25 هست
بنابراین find اندکس اولین مقداری را پیدا می کنه که مقدار هیستوگرام اون بیش از صفر باشه یعنی 25

nina222
دوشنبه 27 بهمن 1393, 14:06 عصر
در عکس سوم گفته smallest value
منظورش اینه که کمترین مقداری که در تصویر وجود داره را باید پیدا کنیم
یک تصویر 8 بیتی میتونه از صفر تا 255 بگیره اما ممکنه کمترین مقدار تصویر صفر نباشه مثلا 25 باشه که ما اون مقدار را میخواهیم
با استفاده از find در هیستوگرام جستجو می کنیم که محل کمترین مقدار تصویر را پیدا کنیم
مثلا فرضا کمترین مقدار برابر 25 باشه مقدار هیستوگرام برای 0 تا 24 برابر صفر هست و مثلا برای 25 برابر با تعداد پیکسلهایی که مقدارشون 25 هست
بنابراین find اندکس اولین مقداری را پیدا می کنه که مقدار هیستوگرام اون بیش از صفر باشه یعنی 25

مرسی این قسمت رو هم محبت می کنید؟


Tmin = hnorm(iTmin);

:افسرده:

rahnema1
دوشنبه 27 بهمن 1393, 14:15 عصر
در اصل گفته بود: smallest value in the cumulative probability density function
که اندکس اون با محل کمترین مقدار در هیستوگرام یکی هست وقتی که اندکس یعنی iTmin بدست اومد دیگه بقیه مطالب بعهده خودتون فقط این دو تا مثل هم هستند

Tmin = hnorm(iTmin);
Tmin = CDF(iTmin);

nina222
دوشنبه 27 بهمن 1393, 15:01 عصر
در اصل گفته بود: smallest value in the cumulative probability density function
که اندکس اون با محل کمترین مقدار در هیستوگرام یکی هست وقتی که اندکس یعنی iTmin بدست اومد دیگه بقیه مطالب بعهده خودتون فقط این دو تا مثل هم هستند

Tmin = hnorm(iTmin);
Tmin = CDF(iTmin);


مرسی. محبت کردید.
درست می فرمایید تو درک مطالب دیگه باید خودم تلاش کنم.البته شما کامل بنده رو راهنمایی کردید.

nina222
سه شنبه 28 بهمن 1393, 14:51 عصر
در اصل گفته بود: smallest value in the cumulative probability density function
که اندکس اون با محل کمترین مقدار در هیستوگرام یکی هست وقتی که اندکس یعنی iTmin بدست اومد دیگه بقیه مطالب بعهده خودتون فقط این دو تا مثل هم هستند

Tmin = hnorm(iTmin);
Tmin = CDF(iTmin);

سلام
به نظر من اگه بخوایم ساده تر بنویسیم این هم درست هست:لبخندساده:



Tmin=min(CDF);

rahnema1
سه شنبه 28 بهمن 1393, 15:00 عصر
نه حداقل CDF که ممکنه برابر با صفر بشه در صورتی که حداقل تصویر ما 25 باشه

nina222
شنبه 02 اسفند 1393, 11:23 صبح
سلام
من می خوام واریانس و میانگین رو بصورت local برای تصویرم محاسبه کنم و به مشکل برخوردم . اما قبل از این که بخوام این کارو انجام بدم خواسته شده بود که میانگین و واریانس و یا انحراف معیار رو بصورت global محاسبه کنم.که خوشبختانه مشکلی نداشت
من کاری که انجام دادم این هست


[v]=statmoments(h1,2);
M=v(1);
variance=v(2);
D = sqrt(variance);

و خود function هم


function [v, unv] = statmoments(p,n)
%STATMOMENTS Computes statistical central moments of image histogram.
% [W,UNV] = STATMOMENTS(P, N) computes up to the Nth statistical
% central moment of a histogram whose components are in vector
% P. The length of P must equal 256 or 65536.
%
% The program outputs a vector V with V(1) = mean, V(2) = variance,
% V(3) = 3rd moment, . . . V(N) = Nth central moment. The random
% variable values are normalized to the range [0, 1], so all
% moments also are in this range.
%
% The program also outputs a vector UNV containing the same moments
% as V, but using un-normalized random variable values (e.g., 0 to
% 255 if length(P) = 2^8). For example, if length(P) = 256 and V(1)
% = 0.5, then UNV(1) would have the value UNV(1) = 127.5 (half of
% the [0 255] range).

Lp = length(p);
if (Lp ~= 256) & (Lp ~= 65536)
error('P must be a 256- or 65536-element vector.');
end
G = Lp - 1;

% Make sure the histogram has unit area, and convert it to a
% column vector.
p = p/sum(p); p = p(:);

% Form a vector of all the possible values of the
% random variable.
z = 0:G;

% Now normalize the z's to the range [0, 1].
z = z./G;

% The mean.
m = z*p;

% Center random variables about the mean.
z = z - m;

% Compute the central moments.
v = zeros(1, n);
v(1) = m;
for j = 2:n
v(j) = (z.^j)*p;
end

if nargout > 1
% Compute the uncentralized moments.
unv = zeros(1, n);
unv(1)=m.*G;
for j = 2:n
unv(j) = ((z*G).^j)*p;
end
end




global کدش به این صورت بود. برای قسمت local به مشکل برخوردم. اگه براتون امکان داره کمکم کنید. مرسی

nina222
شنبه 02 اسفند 1393, 11:30 صبح
در واقع من این فرمول رو پیاده سازی کردم.

nina222
شنبه 02 اسفند 1393, 11:34 صبح
و دیگه نتونستم باقیش رو که این قسمت هست انجام بدم. که این قسمت هست

nina222
شنبه 02 اسفند 1393, 11:35 صبح
برای ناحیه 3*3

rahnema1
شنبه 02 اسفند 1393, 11:42 صبح
دو تا اولی گلوبال و دوتای آخری هم لوکال

I= double(I);

variance = var (I(:));
miangin = mean (I(:));

[r c] = size(I);
img = zeros(r+2,c+2);
img(2:(r + 1) ,2: (c + 1)) = I;
img = [ img(1:r, 1:c)(:), img(1:r, 2: (c + 1))(:),img(1:r, 3: (c + 2 ))(:), img(2:(r + 1),1: c)(:), img(2:(r + 1),2: (c + 1))(:), img(2:(r + 1),3: (c + 2))(:), img(3:(r + 2),1: c)(:), img(3:(r + 2),2: (c + 1))(:), img(3:(r + 2),3: (c + 2))(:)];
temp = zeros(r+2,c+2);
temp(2:(r + 1) ,2: (c + 1)) = 1;
temp = [ temp(1:r, 1:c)(:), temp(1:r, 2: (c + 1))(:),temp(1:r, 3: (c + 2 ))(:), temp(2:(r + 1),1: c)(:), temp(2:(r + 1),2: (c + 1))(:), temp(2:(r + 1),3: (c + 2))(:), temp(3:(r + 2),1: c)(:), temp(3:(r + 2),2: (c + 1))(:), temp(3:(r + 2),3: (c + 2))(:)];
sumpix = sum(temp,2);
miangin_local = sum(img, 2) ./sumpix;
variance_local = (((I(:) -sum(img, 2) ./sumpix).^2) ./ sumpix);
miangin_local = reshape(miangin_local,r,c);
variance_local = reshape(variance_local,r,c);

nina222
شنبه 02 اسفند 1393, 11:48 صبح
یعنی حالت local روی کل تصویرمون بصورت پنجرهای 3*3 اعمال می شه؟

nina222
شنبه 02 اسفند 1393, 11:52 صبح
دو تا اولی گلوبال و دوتای آخری هم لوکال

I= double(I);

variance = var (I(:));
miangin = mean (I(:));

[r c] = size(I);
img = zeros(r+2,c+2);
img(2:(r + 1) ,2: (c + 1)) = I;
img = [ img(1:r, 1:c)(:), img(1:r, 2: (c + 1))(:),img(1:r, 3: (c + 2 ))(:), img(2:(r + 1),1: c)(:), img(2:(r + 1),2: (c + 1))(:), img(2:(r + 1),3: (c + 2))(:), img(3:(r + 2),1: c)(:), img(3:(r + 2),2: (c + 1))(:), img(3:(r + 2),3: (c + 2))(:)];
temp = zeros(r+2,c+2);
temp(2:(r + 1) ,2: (c + 1)) = 1;
temp = [ temp(1:r, 1:c)(:), temp(1:r, 2: (c + 1))(:),temp(1:r, 3: (c + 2 ))(:), temp(2:(r + 1),1: c)(:), temp(2:(r + 1),2: (c + 1))(:), temp(2:(r + 1),3: (c + 2))(:), temp(3:(r + 2),1: c)(:), temp(3:(r + 2),2: (c + 1))(:), temp(3:(r + 2),3: (c + 2))(:)];
sumpix = sum(temp,2);
miangin_local = sum(img, 2) ./sumpix;
variance_local = (((I(:) -sum(img, 2) ./sumpix).^2) ./ sumpix);
miangin_local = reshape(miangin_local,r,c);
variance_local = reshape(variance_local,r,c);

یه مقدار توضیح می دید برای قسمت local ؟

nina222
شنبه 02 اسفند 1393, 11:57 صبح
من سعی کردم از یه حلقه for برایi,j کنم که 3تا 3 تا برن جلو ولی همش خطا داد. می شه این ناحیه 3*3 رو یه مقدار برام توضیح بدید. مرسی:اشتباه:


img = zeros(r+2,c+2);

یه قسمت3*3 در نظر می گیره فقط یا واسه کل تصویر این کارو انجام میده؟

nina222
شنبه 02 اسفند 1393, 12:10 عصر
خطا می ده
()-indexing must appear last in an index expression.

rahnema1
شنبه 02 اسفند 1393, 12:49 عصر
من توی octave اجرا کردم
اینجور اصلاح کنید دیگه باید کار کنه

I= double(I);

variance = var (I(:));
miangin = mean (I(:));

[r c] = size(I);
img = zeros(r+2,c+2);
img(2:(r + 1) ,2: (c + 1)) = I;
temp = zeros(r+2,c+2);
temp(2:(r + 1) ,2: (c + 1)) = 1;

sumimg = img(1:r, 1:c)+ img(1:r, 2: (c + 1))+ img(1:r, 3: (c + 2 )) + img(2:(r + 1),1: c)+ img(2:(r + 1),2: (c + 1))+ img(2:(r + 1),3: (c + 2))+ img(3:(r + 2),1: c)+ img(3:(r + 2),2: (c + 1))+ img(3:(r + 2),3: (c + 2));
numpix = temp(1:r, 1:c)+ temp(1:r, 2: (c + 1))+temp(1:r, 3: (c + 2 ))+ temp(2:(r + 1),1: c)+ temp(2:(r + 1),2: (c + 1))+ temp(2:(r + 1),3: (c + 2))+ temp(3:(r + 2),1: c)+ temp(3:(r + 2),2: (c + 1))+ temp(3:(r + 2),3: (c + 2));
miangin_local = sumimg ./ numpix;
variance_local = (((I - sumimg ./ numpix).^ 2) ./ numpix);

rahnema1
شنبه 02 اسفند 1393, 13:33 عصر
برای کل تصویر عملیات انجام می گیره عملیاتی که می خواد در حلقه انجام بگیره یکجا انجام می دهیم

nina222
شنبه 02 اسفند 1393, 13:36 عصر
برای کل تصویر عملیات انجام می گیره عملیاتی که می خواد در حلقه انجام بگیره یکجا انجام می دهیم

ممنونم:لبخندساده:

nina222
دوشنبه 04 اسفند 1393, 22:33 عصر
برای کل تصویر عملیات انجام می گیره عملیاتی که می خواد در حلقه انجام بگیره یکجا انجام می دهیم

سلام
مهندس بی زحمت این کد local رو یه بار چک می کنید؟ رو تصویرم اعمال کردم نتیجه خوب نشد. مرسی:خجالت:

rahnema1
سه شنبه 05 اسفند 1393, 07:03 صبح
سلام
مهندس بی زحمت این کد local رو یه بار چک می کنید؟ رو تصویرم اعمال کردم نتیجه خوب نشد. مرسی:خجالت:

مهندس خودتی!
والا چک کردم مشکل نداشت. مشکلش از چه جهته؟

nina222
سه شنبه 05 اسفند 1393, 12:50 عصر
مهندس خودتی!
والا چک کردم مشکل نداشت. مشکلش از چه جهته؟

روزتون مبارک مهندس:چشمک:
ای بابا من اگه مهندس بودم که همه سئوالاتم رو از شما نمی پرسیدم. :خجالت:

راستش بعد این که واریانس و میانگین رو استفاده کردم تو پیاده سازیم به نتیجه مورد نظر نرسیدم گفتم شاید ایراد از این قسمت کدم باشه. مرسی که چک کردید.

rahnema1
سه شنبه 05 اسفند 1393, 12:56 عصر
قرار بود به چه نتیجه ای برسید؟

nina222
سه شنبه 05 اسفند 1393, 14:25 عصر
قرار بود به چه نتیجه ای برسید؟

ازش این جا استفاده کردم و خدمتتون ارسال کردم.

nina222
سه شنبه 05 اسفند 1393, 14:36 عصر
خطا داد اصلا شکل 6 رو نشون نمی ده

Operands to the || and && operators must be convertible to logical scalar values.

Error in edit2 (line 81)
if (miangin_local<= 0.5*M)&&(0.03*D<=variance_local)&&(variance_local<=0.5*D);

nina222
سه شنبه 05 اسفند 1393, 14:39 عصر
می شه لطفا با این تست بفرمایید؟

rahnema1
سه شنبه 05 اسفند 1393, 14:40 عصر
این جور باید باشه کاملش را فرستادم

G = zeros(r ,c);
index = ((miangin_local<= 0.5*M) & (0.03*D <=variance_local) & (variance_local<= 0.5*D));
G(index) = 3 * f(index);
G(~index)=f(~index);

nina222
سه شنبه 05 اسفند 1393, 14:53 عصر
این جور باید باشه کاملش را فرستادم

G = zeros(r ,c);
index = ((miangin_local<= 0.5*M) & (0.03*D <=variance_local) & (variance_local<= 0.5*D));
G(index) = 3 * f(index);
G(~index)=f(~index);

عالی بود .:خجالت:

nina222
پنج شنبه 07 اسفند 1393, 14:14 عصر
سلام
من متاسفانه هنوز مشکلم حل نشده و اون مواردی که باید برنامم تشخیص می داد رو تشخیص نمی ده. احتمالا یه جایی از کدم یه مشکلی وجود داره. البته از اون حالت بدی که داشت خیلی بهتر شد به کمک شما اما هنوز کد درستی نیست.
خیلی روش فکر کردم و چند تا نکته به ذهنم رسید که امیدوارم کمک کنید.
میانگین و انحراف معیاری که با تابع statemoments بدست می یاد خیلی فرق داره با اون میانگین و انحراف معیاری که دستور شما ((در حالت global )) بدست می یاره
مثلا برای تصویر مورد نظر من ((در حالت global ))
کد شما 64.4814 و 69.7981 رو بدست آورد و تابع statemoments مقادیر 0.2529 و0.2737 رو بدست آورد.
با توجه به فرمول 7و8و6 به نظر شما باید از کدوم استفاده کنم تابع s.....یا کد شما؟:ناراحت:

با توجه به این که این فرمول ها رو تو کتاب گنزالس دیدم و براشون این تابعی که فرستادم رو آورده بود به نظر شما منظور مقاله کدومشون هست.

rahnema1
پنج شنبه 07 اسفند 1393, 14:32 عصر
احتمالا باید مقادیر را تقسیم بر 255 کنید