Converting Matlab gaussian derivatives to Opencv - matlab
I trying to convert an old exercise i made in matlab to OpenCV. Code is posted below. I havent been able to find any functions in OpenCv that does what i want, might be because of other names then what i expect.
Here are the outputs when taken the max response in each location as label. Clearly somethings wronge.
Here is the matlab code:
function responses = getBifResponsesEx(im, myEps, sigma, kernelSize)
if ( nargin == 3 )
if ( sigma >= 1 )
kernelSize = 6*sigma + 1;
else
kernelSize = 7;
end
end
responses = zeros(size(im,1), size(im,2), 7);
%
% Gaussian derivatives
%
kernVal = ceil(kernelSize/2) - 1;
x = (-kernVal:kernVal);
g = 1/(2*pi*sigma^2)*exp(-(x.^2./(2*(sigma^2))));
g = g/sum(g);
dg = -2*x/(2*sigma^2).*g*sigma;
ddg = ((2*x/(2*sigma^2)).^2 - 1/(sigma^2)).*g*sigma;
%
% Gaussian convolution of the image
%
s00 = filter2(g, im);
s00 = filter2(g', s00);
s10 = filter2(g', im);
s10 = filter2(dg, s10);
s01 = filter2(g, im);
s01 = filter2(dg', s01);
s11 = filter2(dg, im);
s11 = filter2(dg', s11);
s20 = filter2(g', im);
s20 = filter2(g', s20);
s20 = filter2(ddg, s20);
s02 = filter2(g, im);
s02 = filter2(g, s02);
s02 = filter2(ddg', s02);
%
% Symmetry types - MISSING CODE!!!!
%
lam = sigma^2*(s20+s02);
gam = sigma^2*(sqrt((s20-s02).^2+4*s11.^2));
responses(:,:,1) = myEps*s00;
responses(:,:,2) = 2*sigma*sqrt(s10.^2+s01.^2);
responses(:,:,3) = +lam;
responses(:,:,4) = -lam;
responses(:,:,5) = 2^-.5*(gam+lam);
responses(:,:,6) = 2^-.5*(gam-lam);
responses(:,:,7) = gam;
end
And here is my converted page. From what i can see, it goes wronge with the s20,s02 responses. Anyone able to tell me what to do?
void extract_bif_features(const cv::Mat & src,
std::vector<cv::Mat> & dst, BIFParams params)
{
float sigma = params.sigma;
float n=0;
int kernelSize;
if(sigma>=1)
kernelSize = 6*sigma + 1;
else
kernelSize = 7;
cv::Mat gray,p00,p10,p01,p11,p20,p02;
cv::cvtColor(src,gray,CV_BGR2GRAY);
auto kernVal = (int)ceil(kernelSize/2.0) - 1;
cv::Mat_<float> g(1,kernelSize);float*gp = g.ptr<float>();
cv::Mat_<float> dg(1,kernelSize);float*dgp = dg.ptr<float>();
cv::Mat_<float> ddg(1,kernelSize); float*ddgp = ddg.ptr<float>();
cv::Mat_<float> X(1,kernelSize);float*xp = X.ptr<float>();
auto gsum=0.0f;
for(int x = -kernVal;x<=kernVal;++x)
{
xp[x+kernVal] = x;
gp[x+kernVal] = 1/(2*CV_PI*sigma*sigma)*exp(-(x*x/(2*(sigma*sigma))));
gsum += gp[x+kernVal];
}
g = g/gsum;
cv::multiply((-2*X / (2*sigma*sigma)),g*sigma,dg);
cv::pow((2*X/(2*sigma*sigma)),2,ddg);
ddg -=1/(sigma*sigma);
cv::multiply(ddg,g*sigma,ddg);
std::cout << ddg<< std::endl;
std::cout << dg<< std::endl;
cv::sepFilter2D(gray,p00,CV_32FC1,g,g,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE); cv::sepFilter2D(gray,p01,CV_32FC1,dg,g,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE); cv::sepFilter2D(gray,p10,CV_32FC1,g,dg,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE); cv::sepFilter2D(gray,p11,CV_32FC1,dg,dg,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE);
//NOT SURE HERE
cv::sepFilter2D(gray,p20,CV_32FC1,g,ddg,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE);
//cv::sepFilter2D(p20,p20,CV_32FC1,1,g,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE); cv::sepFilter2D(gray,p02,CV_32FC1,g,ddg,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE); //cv::sepFilter2D(p02,p02,CV_32FC1,g,1,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE);
cv::filter2D(gray,p20,CV_32FC1,g,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE);
cv::filter2D(p20,p20,CV_32FC1,g,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE);
cv::filter2D(p20,p20,CV_32FC1,ddg,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE);
cv::filter2D(gray,p02,CV_32FC1,g,cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE);
cv::filter2D(p02,p02,CV_32FC1,g.t(),cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE);
cv::filter2D(p02,p02,CV_32FC1,ddg.t(),cv::Point(-1,-1),0.0,cv::BORDER_REPLICATE);
dst.resize(6);
auto sigma_square = sigma*sigma;
cv::Mat Lam = sigma_square * (p20+p02);
cv::Mat Gam ;
cv::sqrt((((p20-p02)*(p20-p02))+4*p11*p11),Gam);
Gam *= sigma_square ;
cv::Mat test = p10*p10;
//slop
cv::sqrt(p10*p10 + p01*p01,dst[0]);
dst[0] = dst[0]*2*sigma;//slop
//blob
dst[1] = Lam;
dst[2] = -1*Lam;
//line
dst[3] = sqrt(2.0f)*(Gam+Lam);
dst[4] = sqrt(2.0f)*(Gam-Lam);
//saddle
dst[5] = Gam;
}
The answer is from what i get sofar.
cv::multiply((p20-p02),(p20-p02),Gam); is not the same as Gam = (p20-p02)*(p20-p02);
Full Code: Classify according to higest response, Griffin(2008).
RIDAR_API void extract_bif_features(const cv::Mat & src,
std::vector<cv::Mat> & dst, BIFParams params)
{
float sigma = params.sigma;
float eta = params.eta;
int kernelSize;
if(sigma>=1)
kernelSize = 4*sigma + 1;
else
kernelSize = 5;
auto kernVal = (int)ceil(kernelSize/2.0) - 1;
cv::Mat_<float> g(1,kernelSize);float*gp = g.ptr<float>();
cv::Mat_<float> X(1,kernelSize);float*xp = X.ptr<float>();
auto gsum=0.0f;
for(int x = -kernVal;x<=kernVal;++x)
{
xp[x+kernVal] = x;
gp[x+kernVal] = 1/(2*CV_PI*sigma*sigma)*exp(-(x*x/(2*(sigma*sigma))));
gsum += gp[x+kernVal];
} g = g/gsum;
cv::Mat dg = -2*X.mul(g*sigma) / (2*sigma*sigma);
cv::Mat ddg = ((2*X/(2*sigma*sigma)).mul((2*X/(2*sigma*sigma))) - 1/(sigma*sigma)).mul(g*sigma);
cv::Mat gray,p00,p10,p01,p11,p20,p02;
cv::cvtColor(src,gray,CV_BGR2GRAY);
cv::filter2D(gray,p00,CV_32FC1,g);
cv::filter2D(p00,p00,CV_32FC1,g.t());
cv::filter2D(gray,p10,CV_32FC1,g.t());
cv::filter2D(p10,p10,CV_32FC1,dg);
cv::filter2D(gray,p01,CV_32FC1,g);
cv::filter2D(p01,p01,CV_32FC1,dg.t());
cv::filter2D(gray,p11,CV_32FC1,dg);
cv::filter2D(p11,p11,CV_32FC1,dg.t());
cv::filter2D(gray,p20,CV_32FC1,g.t());
cv::filter2D(p20,p20,CV_32FC1,g.t());
cv::filter2D(p20,p20,CV_32FC1,ddg);
cv::filter2D(gray,p02,CV_32FC1,g);
cv::filter2D(p02,p02,CV_32FC1,g);
cv::filter2D(p02,p02,CV_32FC1,ddg.t());
#ifdef DISPLAY_WHILE_RUNNING
double max,min;
cv::imshow("p00",p00/255);
//
cv::minMaxIdx(p01,&min,&max);
cv::imshow("p01",(p01-min)/(max-min));
//
cv::minMaxIdx(p10,&min,&max);
cv::imshow("p10",(p10-min)/(max-min));
cv::minMaxIdx(p11,&min,&max);
cv::imshow("p11",(p11-min)/(max-min));
cv::minMaxIdx(p02,&min,&max);
cv::imshow("p02",(p02-min)/(max-min));
cv::minMaxIdx(p20,&min,&max);
cv::imshow("p20",(p20-min)/(max-min));
cv::waitKey();
#endif
dst.resize(7);
auto sigma_square = sigma*sigma;
auto p2d = p20-p02;
//LAM
dst[2] = sigma_square * (p20+p02);
//GAM
cv::sqrt( (p2d).mul(p2d) + (4.0f * p11.mul(p11)) ,dst[6] );
dst[6] = dst[6] * sigma_square;
//FLAT
dst[0] = eta*p00;
//slop
cv::sqrt(p10.mul(p10)+p01.mul(p01),dst[1]);
dst[1] *= 2.0f*sigma;
//blob dst[2]
dst[3] = -dst[2];
//line
dst[4] = pow(2.0,-0.5)*(dst[6]+dst[2]);
dst[5] = pow(2.0,-0.5)*(dst[6]-dst[2]);
//saddle dst[6]
#ifdef DISPLAY_WHILE_RUNNING
double max,min;
cv::minMaxIdx(dst[0],&min,&max);//
cv::imshow("FLAT",(dst[0]-min)/(max-min));
cv::minMaxIdx(dst[1],&min,&max);//
cv::imshow("SLOPE",(dst[1]-min)/(max-min));
cv::minMaxIdx(dst[2],&min,&max);
cv::imshow("BLOB+",(dst[2]-min)/(max-min));
cv::minMaxIdx(dst[3],&min,&max);//
cv::imshow("BLOB-",(dst[3]-min)/(max-min));
cv::minMaxIdx(dst[4],&min,&max);//
cv::imshow("LINE+",(dst[4]-min)/(max-min));
cv::minMaxIdx(dst[5],&min,&max);
cv::imshow("LINE-",(dst[5]-min)/(max-min));
cv::minMaxIdx(dst[6],&min,&max);
cv::imshow("SADDLE",(dst[6]-min)/(max-min));
cv::waitKey();
#endif
}
why dont you take average on dg and ddg?
cv::filter2D(gray,p20,CV_32FC1,g.t());
cv::filter2D(p20,p20,CV_32FC1,g.t());
why take two times of filter here?
//GAM
cv::sqrt( (p2d).mul(p2d) + (4.0f * p11.mul(p11)) ,dst[6] );
dst[6] = dst[6] * sigma_square;
where you get this formula ?
Related
Using a simple Euler method to solve the EoS of Stars (Mathematica)
I attempted to translate a matlab code: clear clc; %Use a resolution of dr = 10^-N N = 4; %G = GAMMA, adiabatic parameter G = 4/3; % high density/extreme relativistic %G = 5/3; % low density/nonrelativistic r = 0; dr = 10^-N; m(1) = 0; r(1) = 0; rho(1) = 0.1; i = 1; while (i>0) i=i+1; r(i) = r(i-1)+dr; Gamma(i) = rho(i-1)^(G-1) / (3*sqrt(2)) ;%(rho(i-1))^(2/3) / (3*(1+rho(i-1)^(2/3) )^(1/2) ); drho = (m(i-1)*rho(i-1)) / (Gamma(i) * r(i)^2)*dr; if (drho > rho(i-1)) break; else rho(i) = rho(i-1) - drho; end m(i) = m(i-1) + (r(i)^2 * rho(i)) * dr; end Mass = m(i-1) Rad = r(i-1) plot(r(1:i-1),m(1:i-1)) xlabel('Log10(r/[m])') ylabel('M(r) (M_{sol})') Into Mathematica, what I have is: EoS[n0_] := Module[{n = n0}, N1 = 4; G1 = 4/3; G2 = 5/3; rho[n_] := 0.1 + n; m1[n_] := n; dr = 10^(-N1); r[n_] := n; Gamma1[n_] := ((rho[n - 1])^(G1 - 1))/(3*Sqrt[2]); drho = ((m1[n - 1]*rho[n - 1]))/(Gamma1[n - 1]*r[n - 1]^2)*dr; n = 1; While[n > 0, Gamma1[n] && drho; n++] If[drho > rho[-1], Break[], rho[n] = rho[-1] - drho] m1[n] = m1[-1] + ((r[n]^2)*rho[n])*dr; Mass = m1[n - 1]; Rad = r[n - 1]; ParametricPlot[{m[n], r[n]}, {n, 1, n - 1}, AxesLabel -> {"Log10(r/[m])", "M(r)(M_{sol})"}] ] My problem is I'm getting complex solutions when I obviously shouldn't. I'm an absolute novice to mathematica, especially with modules and the euler method itself. Any and all feedback/help would be much appreciated. I'm assuming my increments are wrong, I don't really know.
Same C code different results TIv5.2.5 and gcc 5.4.1 c99 compiler
I am using MSP432P401R to do FFT of SAR ADC samples, did FFT in MATLAB and got results same as C compiler online but Code Composer Studio IDE is giving different output than MATLAB results, I thought that can be a compiler issue so tried reading same did some changes and tried but not getting results Like MATLAB. Online C compiler was gcc 5.4.1 c99. and in CCS TI v5.2.5 compiler is used. float m; float ur, ui, sr, si,tr, ti; long double Temp_A[256],ArrayA[256]={2676,2840,2838,2832,2826,2818,2814,2808, 2804,2798,2790,2784,2778,2770,2764,2758,2752,2746,2740,2734, 2726,2720,2714,2706,2700,2692,2686,2680,2674,2668,2660,2654, 2646,2642,2634,2624,2618,2612,2604,2598,2590,2584,2576,2570, 2562,2556,2550,2542,2536,2530,2522,2512,2508,2498,2490,2484, 2478,2470,2462,2454,2448,2442,2432,2426,2420,2414,2404,2398, 2390,2382,2374,2368,2360,2352,2346,2338,2330,2322,2314,2306, 2300,2294,2286,2278,2272,2262,2258,2250,2238,2234,2228,2220, 2208,2202,2192,2186,2178,2170,2164,2156,2150,2142,2134,2126, 2116,2110,2104,2096,2088,2078,2070,2062,2054,2046,2040,2034, 2026,2018,2010,2002,1994,1986,1978,1970,1962,1954,1946,1936, 1930,1922,1914,1908,1902,1894,1886,1876,1868,1860,1852,1846, 1838,1830,1822,1814,1804,1796,1790,1784,1776,1768,1760,1754, 1746,1738,1728,1720,1714,1708,1698,1692,1684,1674,1668,1656, 1656,1644,1640,1628,1624,1612,1610,1598,1596,1584,1580,1570, 1564,1554,1546,1540,1532,1526,1520,1512,1504,1496,1490,1482, 1474,1468,1462,1454,1446,1438,1432,1424,1420,1410,1404,1398, 1392,1384,1376,1370,1364,1356,1348,1342,1336,1328,1322,1316, 1308,1300,1294,1286,1280,1276,1270,1262,1254,1248,1242,1236, 1230,1222,1216,1210,1206,1198,1192,1188,1178,1172,1168,1162, 1154,1148,1144,1138,1132,1126,1120,1114,1108,1102,1096,1090, 1084,1080,1074,1068,1062,1058,1052,1048},ArrayA_IMX[256]={0}; unsigned int jm1,i; unsigned int ip,l; void main(void) { WDT_A->CTL = WDT_A_CTL_PW |WDT_A_CTL_HOLD; VCORE(); CLK(); P1DIR |= BIT5; //CLK--AD7352 OUTPUT DIRECTION P1DIR |= BIT7; //CHIP SELECT--AD7352 OUTPUT DIRECTION P5DIR &= ~BIT0; //SDATAA--AD7352 INPUT DIRECTION P5.0 P5DIR &= ~BIT2; //SDATAB--AD7352 INPUT DIRECTION P5.2 while(1) { bit_reversal(ArrayA); fft(ArrayA,ArrayA_IMX); } } void bit_reversal(long double REX[]) { int i,i2,n,m; int tx,k,j; n = 1; m=8; for (i=0;i<m;i++) { n *= 2; } i2 = n >> 1; j = 0; for (i=0;i<n-1;i++) { if (i < j) { tx = REX[i]; //ty = IMX[i]; REX[i] = REX[j]; //IMX[i] = IMX[j]; REX[j] = tx; //IMX[j] = ty; } k = i2; while (k <= j) { j -= k; k >>= 1; } j += k; } } void fft(long double REX[],long double IMX[]) { N = 256; nm1 = N - 1; nd2 = N / 2; m = log10l(N) / log10l(2); j = nd2; for (l = 1; l <= m; l++) { le = powl(2, l); le2 = le / 2; ur = 1; ui = 0; // Calculate sine and cosine values sr = cosl(M_PI/le2); si = -sinl(M_PI/le2); // Loop for each sub DFT for (j = 1; j <= le2; j++) { jm1 = j - 1; // Loop for each butterfly for (i = jm1; i <= nm1; i += le) { ip = i + le2; tr = REX[ip]*ur - IMX[ip]*ui; ti = REX[ip]*ui + IMX[ip]*ur; REX[ip] = REX[i] - tr; IMX[ip] = IMX[i] - ti; REX[i] = REX[i] + tr; IMX[i] = IMX[i] + ti; } tr = ur; ur = tr*sr - ui*si; ui = tr*si + ui*sr; } } }
Function to compute Scallop Loss
I want to make a function that computes the value of the Scallop loss for a Rectangular, Hamming and Blackman window using the Scallop loss formula. I have created a function but it only returns that answer 0, have I made an error? function s_l = scallop loss(len) window = rectwin(len); num_total = 0; den_total = 0; for n = 0:len-1 A1 = exp(-((1i*(n)*pi)/len)); A2 = window(n+1)*A1; num = abs(A2); den = win(n+1); num_total = num_total + num; den_total = den_total + den: end result = 20*log(num_total/den_total); s_l = result;
You have a maths problem: abs(sum(A)) != sum(abs(A)) They are not the same! Change your code to: window = rectwin(len); num_total = 0; den_total = 0; for n = 0:len-1 A1 = exp(-((1i*(n)*pi)/len)); A2 = window(n+1)*A1; num = A2; % !! den = abs(window(n+1)); % you also forgot the abs here num_total = num_total + num; den_total = den_total + den; end num_total=abs(num_total); % !! result = 20*log(num_total/den_total); s_l = result;
please change the log() function to log10(). without it the result is completely wrong :) I mean this line: result = 20*log10*(num_total/den_total);
Efficient solution to object detection algorithm
I'm trying to implement this paper 'Salient Object detection by composition' here is the link: http://research.microsoft.com/en-us/people/yichenw/iccv11_salientobjectdetection.pdf I have implemented the algorithm but it takes a long time to execute and display the output. I'm using 4 for loops in the code(Using for loops is the only way I could think of to implement this algorithm.) I have searched online for MATLAB code, but couldn't find anything. So can anyone please suggest any faster way to implement the algorithm. Also in the paper they(the authors) say that they have implemented the code using MATLAB and it runs quickly. So there definitely is a way to write the code more efficiently. I appreciate any hint or code to execute this algorithm efficiently. clc clear all close all %%instructions to run segment.cpp %to run this code %we need an output image %segment sigma K min input output %sigma: used for gaussian smoothing of the image %K: scale of observation; larger K means larger components in segmentation %min: minimum component size enforced by post processing %% %calculating composition cost for each segment I_org = imread('segment\1.ppm'); I = imread('segment\output1.ppm'); [rows,cols,dims] = size(I); pixels = zeros(rows*cols,dims); red_channel = I(:,:,1); green_channel = I(:,:,2); blue_channel = I(:,:,3); [unique_pixels,count_pixels] = countPixels(I); no_segments = size(count_pixels,1); area_segments = count_pixels ./ (rows * cols); appearance_distance = zeros(no_segments,no_segments); spatial_distance = zeros(no_segments,no_segments); thresh = multithresh(I_org,11); thresh_values = [0 thresh]; for i = 1:no_segments leave_pixel = unique_pixels(i,:); mask_image = ((I(:,:,1) == leave_pixel(1)) & (I(:,:,2) == leave_pixel(2)) & (I(:,:,3) == leave_pixel(3))); I_i(:,:,1) = I_org(:,:,1) .* uint8((mask_image)); I_i(:,:,2) = I_org(:,:,2) .* uint8((mask_image)); I_i(:,:,3) = I_org(:,:,3) .* uint8((mask_image)); LAB_trans = makecform('srgb2lab'); I_i_LAB = applycform(I_i,LAB_trans); L_i_LAB = imhist(I_i_LAB(:,:,1)); A_i_LAB = imhist(I_i_LAB(:,:,2)); B_i_LAB = imhist(I_i_LAB(:,:,3)); for j = i:no_segments leave_pixel = unique_pixels(j,:); mask_image = ((I(:,:,1) == leave_pixel(1)) & (I(:,:,2) == leave_pixel(2)) & (I(:,:,3) == leave_pixel(3))); I_j(:,:,1) = I_org(:,:,1) .* uint8((mask_image)); I_j(:,:,2) = I_org(:,:,2) .* uint8((mask_image)); I_j(:,:,3) = I_org(:,:,3) .* uint8((mask_image)); I_j_LAB = applycform(I_j,LAB_trans); L_j_LAB = imhist(I_j_LAB(:,:,1)); A_j_LAB = imhist(I_j_LAB(:,:,2)); B_j_LAB = imhist(I_j_LAB(:,:,3)); appearance_distance(i,j) = sum(min(L_i_LAB,L_j_LAB) + min(A_i_LAB,A_j_LAB) + min(B_i_LAB,B_j_LAB)); spatial_distance(i,j) = ModHausdorffDist(I_i,I_j) / max(rows,cols); end end spatial_distance = spatial_distance ./ max(max(spatial_distance)); max_apperance_distance = max(max(appearance_distance)); composition_cost = ((1 - spatial_distance) .* appearance_distance) + (spatial_distance * max_apperance_distance); %% %input parameters for computation window_size = 9; %rows and colums are considered to be same window = ones(window_size); additional_elements = (window_size - 1)/2; I_temp(:,:,1) = [zeros(additional_elements,cols);I(:,:,1);zeros(additional_elements,cols)]; I_new(:,:,1) = [zeros(rows + (window_size - 1),additional_elements) I_temp(:,:,1) zeros(rows + (window_size - 1),additional_elements)]; I_temp(:,:,2) = [zeros(additional_elements,cols);I(:,:,2);zeros(additional_elements,cols)]; I_new(:,:,2) = [zeros(rows + (window_size - 1),additional_elements) I_temp(:,:,2) zeros(rows + (window_size - 1),additional_elements)]; I_temp(:,:,3) = [zeros(additional_elements,cols);I(:,:,3);zeros(additional_elements,cols)]; I_new(:,:,3) = [zeros(rows + (window_size - 1),additional_elements) I_temp(:,:,3) zeros(rows + (window_size - 1),additional_elements)]; cost = zeros(rows,cols); for i = additional_elements + 1:rows for j = additional_elements+1:cols I_windowed(:,:,1) = I_new(i-additional_elements:i+additional_elements,i-additional_elements:i+additional_elements,1); I_windowed(:,:,2) = I_new(i-additional_elements:i+additional_elements,i-additional_elements:i+additional_elements,2); I_windowed(:,:,3) = I_new(i-additional_elements:i+additional_elements,i-additional_elements:i+additional_elements,3); [unique_pixels_w,count_pixels_w] = countPixels(I_windowed); unique_pixels_w = setdiff(unique_pixels_w,[0 0 0],'rows'); inside_segment = setdiff(unique_pixels,unique_pixels_w); outside_segments = setdiff(unique_pixels,inside_segment); area_segment = count_pixels_w; for k = 1:size(inside_pixels,1) current_segment = inside_segment(k,:); cost_curr_seg = sort(composition_cost(ismember(unique_pixels,current_segment,'rows'),:)); for l = 1:size(cost_curr_seg,2) if(ismember(unique_pixels(l,:),outside_segments,'rows') && count_pixels(l) > 0) composed_area = min(area_segment(k),count_pixels(l)); cost(i,j) = cost(i,j) + cost_curr_seg(l) * composed_area; area_segment(k) = area_segment(k) - composed_area; count_pixels(l) = count_pixels(l) - composed_area; if area_segment(k) == 0 break end end end if area(k) > 0 cost(i,j) = cost(i,j) + max_apperance_distance * area_segment(k); end end end end cost = cost / window_size; The code for the countPixels function: function [unique_rows,counts] = countPixels(I) [rows,cols,dims] = size(I); pixels_I = zeros(rows*cols,dims); count = 1; for i = 1:rows for j = 1:cols pixels_I(count,:) = reshape(I(i,j,:),[1,3]); count = count + 1; end end [unique_rows,~,ind] = unique(pixels_I,'rows'); counts = histc(ind,unique(ind)); end
Perform step-by-step integral
I have this piece of code: time = 614.4; Uhub = 11; HubHt = 90; TI = 'A'; N1 = 4096; N2 = 32; N3 = 32; L1 = Uhub*time; L2 = 150; L3 = 220; V = L1*L2*L3; gamma = 3.9; c = 1.476; b = 5.6; if HubHt < 60 lambda1 = 0.7*HubHt; else lambda1 = 42; end L = 0.8*lambda1; if isequal(TI,'A') Iref = 0.16; sigma1 = Iref*(0.75*Uhub + b); elseif isequal(TI,'B') Iref = 0.14; sigma1 = Iref*(0.75*Uhub + b); elseif isequal(TI,'C') Iref = 0.12; sigma1 = Iref*(0.75*Uhub + b); else sigma1 = str2num(TI)*Uhub/100; end sigma_iso = 0.55*sigma1; %% Wave number vectors ik1 = cat(2,(-N1/2:-1/2),(1/2:N1/2)); ik2 = -N2/2:N2/2-1; ik3 = -N3/2:N3/2-1; [x y z] = ndgrid(ik1,ik2,ik3); k1 = reshape((2*pi*L/L1)*x,N1*N2*N3,1); k2 = reshape((2*pi*L/L2)*y,N1*N2*N3,1); k3 = reshape((2*pi*L/L3)*z,N1*N2*N3,1); k = sqrt(k1.^2 + k2.^2 + k3.^2); Now I should calculate where The procedure to calculate the integral is At the moment I'm using this loop E = #(k) (1.453*k.^4)./((1 + k.^2).^(17/6)); E_int = zeros(1,N1*N2*N3); E_int(1) = 1.5; for i = 2:(N1*N2*N3) E_int(i) = E_int(i) + quad(E,i-1,i); end neglecting for the k>400 approximation. I believe that my loop is not right. How would you suggest to calculate the integral? I thank you in advance. WKR, Francesco
This is a list of correction from the more obvious to the possibly more subtle. (Indeed I start from what you wrote in the final part going upwards). From what you write: E = #(k) (1.453*k.^4)./((1 + k.^2).^(17/6)); E_int = zeros(1,N1*N2*N3); E_int(1) = 1.5; for i = 2:(N1*N2*N3) %//No point in doing this: %//E_int(i) = E_int(i) + quad(E,i-1,i); %//According to what you write, it should be: E_int(i) = E_int(i-1) + quad(E,i-1,i); end You could speed the whole thing up by doing %//Independent integration on segments Local_int = arrayfun(#(i)quad(E,i-1,i), 2:(N1*N2*N3)); Local_int = [1.5 Local_int]; %//integral additivity E_int = cumsum(Local_int); Moreover, if the known condition (point 2.) really is "... ( = 1.5 if k' = 0)", then the whole implementation should really be more like %//Independent integration on segments Local_int = arrayfun(#(i)quad(E,i-1,i), 2:(N1*N2*N3)); %//integral additivity + cumulative removal of queues E_int = 1.5 - [0 fliplr(cumsum(fliplr(Local_int)))]; %//To remove queues