嗨,我想使用邻域像素值增强图像的对比度.
让图像被视为u0.然后我想通过使用公式来增强图像

这里,M1是最小值,M2是邻域像素中u0的最大值,Mg是原始图像的最大灰度值.我手术的邻居是9X9.uN是新生成的图像(对比度增强图像).
我已经尝试了以下代码但不确定我是否正确.
%Generate a contrast enhanced image
tic
clear all; close all;
I = imread('4.jpg');
I = imresize(I,[128 128]);
if size(I,3)== 3
P = rgb2gray(uint8(I));
P = double(P);
elseif size(I,3) == 2
P = 0.5.*(double(I(:,:,1))+double(I(:,:,2)));
else
P = double(I);
end
ssize=9;
mg=max(P(:));
f1 = @(x) min(x(:));
m1 = nlfilter(P,[9 9],f1);
f2 = @(x) max(x(:));
m2 = nlfilter(P,[9 9],f2);
P_op=((P-m1)./(m2-m1)).*mg;
subplot(2,1,1),imagesc(P,[0 255]);colormap(gray);axis off;
subplot(2,1,2),imagesc(P_op,[0 255]);colormap(gray);axis off;
toc
Run Code Online (Sandbox Code Playgroud)
我得到的一些结果如下所示:




任何人都可以检查并告诉我我的代码是否正确?我不太确定自己.还请告诉我是否有更好的方法.先谢谢你们.
编辑问题我重新阅读了工作,我必须将滑动窗口功能应用于几个指定的像素.**
我必须应用的像素在此方法中找到.检测图像的初始轮廓(以红色显示在图像上).然后在指定距离处绘制轮廓周围的带. 滑动窗口功能必须仅应用于原始图像的窄带内的那些像素
我正在给出图像,初始轮廓和乐队图像.




以白色标记的像素是我指定的像素,在该像素上必须应用滑动功能.是否可以根据此类标准应用nfilter?请帮忙.如果我的问题不正确,我会进一步澄清.
matlab image-processing image-enhancement contrast sliding-window
我已经用4种不同的方式写下了一个函数,我想给它计时.
到目前为止我一直在做这件事:
tic
%//function 1
toc
tic
%//function 2
toc
tic
%//function 3
toc
tic
%//function 4
toc
Run Code Online (Sandbox Code Playgroud)
但现在我想计算每个函数的时序数据(比如说100次),然后计算每个函数花费的平均时间.我怎么能这样做?
另外我在某处读到打印的时间是经过的"挂钟"时间 - 所以当MATLAB程序运行时,它会受到我的计算机正在做的其他事情的影响.
这样做有更好的方法吗?我听说有一个MATLAB内置的代码分析器,命令为"profile on".请问有人可以建议我使用它的方式吗?
我还咨询了这些站点:MATLAB和Profiler中的时序代码,以查找代码瓶颈.
请建议如何在循环中多次执行此操作.提前致谢.
编辑:2013年9月23日:按照每个人的建议我这样做:我的功能被定义为一,二,三和四.
tic
%//function 1
toc
tic
%//function 2
toc
tic
%//function 3
toc
tic
%//function 4
toc
Run Code Online (Sandbox Code Playgroud)
然后我运行了这个程序并得到了这个时间:
tic
%//function 1
toc
tic
%//function 2
toc
tic
%//function 3
toc
tic
%//function 4
toc
Run Code Online (Sandbox Code Playgroud)
我得到的时间是:
tic
%//function 1
toc
tic
%//function 2
toc
tic
%//function 3
toc
tic …Run Code Online (Sandbox Code Playgroud) 我试图优化我的代码,发现我的一个代码是瓶颈.我的代码是:
function [] = one(x)
I = imread('coins.png');
I = double(I);
I = imresize(I,[x x]);
sig=.8; % scale parameter in Gaussian kernel
G=fspecial('gaussian',15,sig); % Caussian kernel
Img_smooth=conv2(I,G,'same'); % smooth image by Gaussiin convolution
[Ix,Iy]=gradient(Img_smooth);
f=Ix.^2+Iy.^2;
g=1./(1+f); % edge indicator function.
end
Run Code Online (Sandbox Code Playgroud)
我试图像这样运行它:清除所有;关闭所有;
x=4000;N=1;
tic
for i=1:N
one(x);
end
toc
Run Code Online (Sandbox Code Playgroud)
我发现梯度算子语句消耗的时间最多(约占总时间的60%).所以它让我思考如何进一步优化我的代码....
我咨询过几个网站:Dgradient和http://regularize.wordpress.com/2013/06/19/how-fast-can-you-calculate-the-gradient-of-an-image-in-matlab/
但是Dgradient是一个MEX文件,我不想使用它.我想写自己的渐变功能.我在博客中读到matlab中的梯度算子明显更慢,并且通过使用shift&substract和稀疏矩阵加速.
我不了解稀疏矩阵.但是我确实尝试使用shift和substract方法.但是我很确定我的代码是错误的.请问任何人都可以澄清matlab用于计算其梯度的差异是什么?并告诉我如何在我的代码中执行此操作?
clc;clear all;close all;
I = imread('coins.png');
I = double(I(:,:,1));
I = imresize(I,[4 4]);
tic
[dx dy] = gradient(I);
toc
tic …Run Code Online (Sandbox Code Playgroud) 我有个问题.我正在尝试实现这段短代码.

我已经完成的基本步骤.请检查下面的代码:
clc;clear all;close all;
A=round(-3+(6).*rand(5,5));
B=round(-3+(6).*rand(5,5));
%//The check matrix stores the conditions present on the right side of the equation.
check = A.*B
%//upd_max and upd_min are the given as the del_max and del_min in the equation
upd_max = 0.5;
upd_min = 0.1;
%//eta_plus and eta_minus are denoted as nplus and nminus
nplus = 1.2;
nminus = 0.5;
%del_(k-1)_i matrix is given as update_mat
update_mat = (0.1+(0.4).*rand(size(check))).*ones(size(check))
update_new = update_mat.*(check==0) + bsxfun(@min,(nplus.*update_mat.*(check>0)),upd_max)...
+ bsxfun(@max,nminus.*(update_mat.*(check<0)),upd_min)
Run Code Online (Sandbox Code Playgroud)
我在下面给出了一段代码的示例结果:
check =
2 -6 …Run Code Online (Sandbox Code Playgroud) 我有一个由正值和负值组成的矩阵.我需要做这些事情.
设u(i,j)表示矩阵的像素u.
u(i-1,j)和u(i+1,j)具有相反的符号或u(i,j-1)和u(i,j+1)具有相反的符号.(2r+1)X(2r+1)适用于每个像素.我正在考虑r=1它,我必须实际获得每个零交叉像素的8个邻域像素.我在一个程序中完成了这个.请看下面的内容.
%// calculate the zero crossing pixels
front = isfront(u);
%// calculate the narrow band of around the zero crossing pixels
band = isband(u,front,1);
Run Code Online (Sandbox Code Playgroud)
我也附上了isfront和isband功能.
function front = isfront( phi )
%// grab the size of phi
[n, m] = size(phi);
%// create an boolean matrix whose value at each pixel is 0 or 1
%// …Run Code Online (Sandbox Code Playgroud) 嗨,我在matlab中遇到问题,我想创建一个包含10个子图的图形。在2X5方向。但是问题是我想减少它们之间的死区面积。我还需要保留标题,第一行图像为xlabel,第二行图像为xlabel(only)。不需要ylabel。
到现在为止,我已经完成了此代码(对于第一行):一旦确定了第一行,第二行应该是小菜一碟。
close all
figure,set(gca,'Color','none')
subplot(2,5,1);subplot('Position',[0.02 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,1)), [0 0], 'r','LineWidth',2);
hold off;title('1st curve','FontSize',12);xlabel('(a)','FontSize',12)
subplot(2,5,2);subplot('Position',[0.215 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,2)), [0 0], 'r','LineWidth',2);
hold off;title('2nd curve','FontSize',12);xlabel('(b)','FontSize',12)
subplot(2,5,3);subplot('Position',[0.410 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,3)), [0 0], 'r','LineWidth',2);
hold off;title('3rd curve','FontSize',12);xlabel('(c)','FontSize',12)
subplot(2,5,4);subplot('Position',[0.605 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,4)), [0 0], 'r','LineWidth',2);
hold off;title('4th …Run Code Online (Sandbox Code Playgroud) 我目前正在MATLAB上实现图像分割.我有两个实现.
我试图通过使用骰子系数或Jaccard指数来计算分割图像和地面实况(手动分割图像)之间的相似性度量.这适用于已分割为两个区域的分割图像.这是通过以下代码实现的.
dice = 2*nnz(segIm&grndTruth)/(nnz(segIm) + nnz(grndTruth))
Run Code Online (Sandbox Code Playgroud)
这要求segIm和grndTruth具有相同的大小.它们也必须是数字或逻辑的.
但是,我还没有找到一种方法来应用这种方法来比较多区域分割图像的相似性.谁能告诉我如何在我的应用程序中使用骰子系数?
编辑: 关于nkjt的建议我做了一个基本的实现,并给出了下面的结果.请随意升级代码,以获得更高的准确性.
我正在考虑两个矩阵形式的两个图像.A是分段图像,B是手动基础事实.下面给出了上述建议实现的matlab代码.请检查并确实给出您的想法.
A=[1 2 3 4;1 2 3 4;1 2 3 4;1 2 3 4]
B=[1 3 4 4;1 1 3 4;1 2 3 4;1 2 3 1]
%//First Suggestion
dice = 2*nnz(A==B)/(nnz(A) + nnz(B))
%//2nd Suggestion
A1=(A==1);B1=(B==1);
A2=(A==2);B2=(B==2);
A3=(A==3);B3=(B==3);
A4=(A==4);B4=(B==4);
dice = (2*nnz(A1&B1)/(nnz(A1) + nnz(B1))...
+2*nnz(A2&B2)/(nnz(A2) + nnz(B2))...
+2*nnz(A3&B3)/(nnz(A3) + nnz(B3))...
+2*nnz(A4&B4)/(nnz(A4) + nnz(B4)))/4
Run Code Online (Sandbox Code Playgroud)
请注意:我也有兴趣知道在这种情况下,对于3相和4相分段图像是否可以应用Hausdorff距离测量?
编辑:我有一个新的查询.如果假设图像具有4个区域,并以这种方式被正确地分割为显示在下面的例子:如果现在不同强度值被用于表示不同的区域,然后使用骰子系数的两个分段的结果将给出不同的结果.对于 …
我想生成一个这样的数组:
a = [1 1 2 2 3 3 4 4 5 5 6 6 ....]
%% or something like this
a = [1 1 1 .. ktimes 2 2 2 ... ktimes .....]
Run Code Online (Sandbox Code Playgroud)
这可以通过MATLAB中的单行代码完成吗?我相信有几个答案.请不要循环.
我在matlab中遇到了问题.我输出一个图像,如示例所示,并通过print命令保存.我想要做的是保存图像,使得没有死空间,即我想删除保存的图像中的空白区域.
示例: 
黑色边框显示图像占据的总面积.这真是一个空间的浪费.我想删除它.我想要做的是:
我手动删除了图像周围的白色区域.但我想通过print命令自动执行此操作.可以吗?如果可能,标题仍然可以吗?即使它被删除然后也没关系,但如果标题可以保持更好.
matlab ×10
optimization ×3
subplot ×2
arrays ×1
bsxfun ×1
contrast ×1
gradient ×1
image ×1
max ×1
min ×1
neighbours ×1
performance ×1
plot ×1
timer ×1