每行不要超过80字符
十行以内,你写过哪些比较酷的Mathematica代码? - Wolfram Mathematica
Zhang He
,You can be serious without a suit.
一键磨皮。。。
I= double(imread('1.jpg'));
H = RF(I,30,100) - I + 128;
G = imfilter(H,fspecial('gaussian',[3 3],100));
opacity = 50;
Dst = (I*(100 - opacity)+(I+2*G-256)*opacity)/100;
imshow([uint8(I) uint8(Dst)]);
后面的图片可能有些不友善,慎重下拉!!!
这是输入的原图。
这是效果图
再来两张效果
这里, RF是递归域变换滤波器( Domain Transform Filter,点此 下载),也可换成其它保边平滑的滤波器( Edge Perserving Filter),例双边滤波,导向滤波等。不是什么黑魔法啊~~,就是 PhotoShop平湖法磨皮:完美保留皮肤纹理磨皮教程_PS图片处理,按步骤用Matlab化而已。
这里,给出最后的计算公式,
Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100
EPFFilter是一种保边平滑的滤波器, Opacity控制透明度, GaussBlur是高斯滤波了,简单的PS的操作非常易于用 Matlab程序化。
磨皮后可以再增加美白功能,也是不超过十行代码的,效果看起来更佳(其实我是想说,可以卖一个好价钱呢)。若是对皮肤美白,磨皮,祛痘这些算法感兴趣,可以在 Imageshop博客 进一步学习。
补充说明,
Matlab并没有收录 RF这个函数,但 Matlab2014a已经有 imguidedfilter函数,在 Matlab2014a可以运行以下6行代码。
I= double(imread('7.png'));
H =double(imguidedfilter(uint8(I))) - I + 128;
G = imfilter(H,fspecial('gaussian',[3 3],100));
opacity = 50;
Dest = (I*(100 - opacity)+(I+2*G - 256)*opacity)/100;
imshow([uint8(I) uint8(Dest)]);
除了此外,图像处理中很多算法都可以用Matlab在10行内完成的。
比如美图秀秀的滤镜,彩铅,素描等,我就不再泄露更多秘密了。
参考资料
Imageshop 博客园
Guided filtering of images
Computational Photography
美图秀秀网页版 官方网站
不是自己写的。。。
贴个神犇代码。。 @Filestorm
http://www.klab.caltech.edu/~xhou/projects/spectralResidual/spectralresidual.html
6行代码,1300+文章引用。。
----------------update--------------------
说6行代码最主要是印象中poster里面,第五行分成了两行写,写答案的时候也没重新数。
第五行比较长。超过了80个字符,算两行也不为过。
贴个神犇代码。。 @Filestorm
%% Spectral Residual
myFFT = fft2(inImg);
myLogAmplitude = log(abs(myFFT));
myPhase = angle(myFFT);
mySpectralResidual = myLogAmplitude - imfilter(myLogAmplitude, fspecial('average', 3), 'replicate');
saliencyMap = abs(ifft2(exp(mySpectralResidual + i*myPhase))).^2;
6行代码,1300+文章引用。。
----------------update--------------------
说6行代码最主要是印象中poster里面,第五行分成了两行写,写答案的时候也没重新数。
第五行比较长。超过了80个字符,算两行也不为过。
我说个比较实用的:
每次写预习报告,实验报告都要在word里画什么流程图啊,连线图啊什么的,超烦啊!
我就想着能不能直接把实验指导书上的图拍下来直接放word里然后打印交上去,但是老师肯定会觉得我态度不认真不给我分啊!
这图打印出来绝壁不行啊:
于是我编写了如下代码(都看得懂):
B = imread('1.png');
A= rgb2gray(B);
[m,n]=size(A);
for i=1:1:m
for j=1:1:n
if(A(i,j)>110)
A(i,j)=255;
end
end
end
imwrite(A,'1.jpg')
效果如下:
直接贴上打印没问题!当时就觉得没有更酷的了!
每次写预习报告,实验报告都要在word里画什么流程图啊,连线图啊什么的,超烦啊!
我就想着能不能直接把实验指导书上的图拍下来直接放word里然后打印交上去,但是老师肯定会觉得我态度不认真不给我分啊!
这图打印出来绝壁不行啊:
于是我编写了如下代码(都看得懂):
B = imread('1.png');
A= rgb2gray(B);
[m,n]=size(A);
for i=1:1:m
for j=1:1:n
if(A(i,j)>110)
A(i,j)=255;
end
end
end
imwrite(A,'1.jpg')
效果如下:
直接贴上打印没问题!当时就觉得没有更酷的了!
一个函数,程序跑完自动发个邮件给自己,7~8行,代码找到了再上传。
代码:
你以为我会告诉你我的邮箱密码?
下面是代码(已修改外函数版,共9行)
function mailme(subject,content,MailAddress,password,DataPath,MailServer)
setpref('Internet','E_mail',MailAddress);
setpref('Internet','SMTP_Server',MailServer);%SMTP服务器
setpref('Internet','SMTP_Username',MailAddress);
setpref('Internet','SMTP_Password',password);
props = java.lang.System.getProperties;
props.setProperty('mail.smtp.auth','true');
sendmail(MailAddress,subject,content,DataPath);
end
%主题 subject
%正文 content
%手机邮箱地址 MailAddress
%密码 password
%附件 DataPath
%邮件服务器 MailServer
代码:
你以为我会告诉你我的邮箱密码?
下面是代码(已修改外函数版,共9行)
function mailme(subject,content,MailAddress,password,DataPath,MailServer)
setpref('Internet','E_mail',MailAddress);
setpref('Internet','SMTP_Server',MailServer);%SMTP服务器
setpref('Internet','SMTP_Username',MailAddress);
setpref('Internet','SMTP_Password',password);
props = java.lang.System.getProperties;
props.setProperty('mail.smtp.auth','true');
sendmail(MailAddress,subject,content,DataPath);
end
%主题 subject
%正文 content
%手机邮箱地址 MailAddress
%密码 password
%附件 DataPath
%邮件服务器 MailServer
a=imread('F:\1.jpg');
b=imread('F:\2.jpg');
aa=0.5*a;
bb=0.5*b;
c=imadd(aa,bb);
imshow(c);
做重曝的代码 不怎么酷
但是 就是这段代码让我意识到
可能matlab才是最好的图像处理软件
TUT
ps.关于重曝可以参考摄影之友的这两篇东西↓
>注入彩虹的梦幻重曝
>高桥美纪 多重曝光
得到好看的重曝照片本身是技术活 这段代码只是提供了一个简单粗暴的叠加方法(然后为我打开了新世界的大门)而已-v-
b=imread('F:\2.jpg');
aa=0.5*a;
bb=0.5*b;
c=imadd(aa,bb);
imshow(c);
做重曝的代码 不怎么酷
但是 就是这段代码让我意识到
可能matlab才是最好的图像处理软件
TUT
ps.关于重曝可以参考摄影之友的这两篇东西↓
>注入彩虹的梦幻重曝
>高桥美纪 多重曝光
得到好看的重曝照片本身是技术活 这段代码只是提供了一个简单粗暴的叠加方法(然后为我打开了新世界的大门)而已-v-
=============================我又来更新了===============================
====================这次也不超过十行,上了颜色=============================
----------------------------------------更新一个-------------------------
这个没有什么技术含量,就是好玩。这一阵玩以撒的结合,看到激光加跟踪觉得蛮有意思。
于是用matlab做了一个。图如下,代码太多超过10行了就不贴了。
左边浅蓝色是激光的跟踪范围,右边是激光效果。红色星号代表怪物。
-------------------------------再次更新----------------------------------
这次是一个把图片转换称如下风格的程序,有一句我分成了两行,去掉最后依据修饰用的axis equal;刚好10行。有哪位同好知道是什么风格麻烦告诉我。
====================这次也不超过十行,上了颜色=============================
y=0.0001:0.0001:1;
for i=1:10000
x(i)=-1.2*y(i)*log(y(i))+1/30*exp(1)^(-(30*y(i)-30/exp(1))^4);
end
fill([x(1:5000),x(5001:10000)],[y(1:5000),y(5001:10000)],[253/255,226/255,202/255],'edgealpha',0);
axis ([0 1 0 1 ]);
----------------------------------------更新一个-------------------------
这个没有什么技术含量,就是好玩。这一阵玩以撒的结合,看到激光加跟踪觉得蛮有意思。
于是用matlab做了一个。图如下,代码太多超过10行了就不贴了。
左边浅蓝色是激光的跟踪范围,右边是激光效果。红色星号代表怪物。
-------------------------------再次更新----------------------------------
这次是一个把图片转换称如下风格的程序,有一句我分成了两行,去掉最后依据修饰用的axis equal;刚好10行。有哪位同好知道是什么风格麻烦告诉我。
I=imread('测试2.jpg');
[row,col,~]=size(I);
X=[1+round((col-1)*rand(1000,1)),1+round((row-1)*rand(1000,1))];
tri = delaunay(X);
ns=length(tri);%
I=double(I);
for i=1:ns
patch(X(tri(i,:),1),col*ones(3,1)-X(tri(i,:),2),[I(X(tri(i,2),2),X(tri(i,2),1),1)/255, ...
I(X(tri(i,2),2),X(tri(i,2),1),2)/255, I(X(tri(i,2),2),X(tri(i,2),1),3)/255],'edgecolor','none');
end
axis equal;
常年专注写短代码的人飘过。感谢
@井号键 的提及和关注。希望今后能写更多短代码 paper 给各位看官 :-)
刚刚看到另外一个有趣的问题, 各个数位都不含9的所有8位数的倒数和是多少? - 算法
顺手写完代码又优化了一下,一稿多投到这里:
刚刚看到另外一个有趣的问题, 各个数位都不含9的所有8位数的倒数和是多少? - 算法
顺手写完代码又优化了一下,一稿多投到这里:
dimNum = 8;
hyperCube = reshape(0:10^dimNum-1, ones(1, dimNum)*10);
allCoord = repmat({1:9}, [1,dimNum]);
allCoord{end} = 2:9;
hyperCube = hyperCube(allCoord{:});
disp(sum(1./hyperCube(:)))
强烈鄙视这些追求代码短的,估计大多数人根本不懂Matlab内存分配的原理。
搞搞大矩阵的计算就知道了,把两行代码精简成一行会直接造成out of memory。
你们要是觉得 A=B*(C*D) 和 A=C*D;A=B*A;一样,你们就naive了。
搞搞大矩阵的计算就知道了,把两行代码精简成一行会直接造成out of memory。
你们要是觉得 A=B*(C*D) 和 A=C*D;A=B*A;一样,你们就naive了。
当年机器学习课的一次作业,用Naive Bayes实现文档分类,我用4行Matlab代码搞定。
输入:
输入:
- countTrain:N*V矩阵,第i行第j列表示第i篇训练文档中,单词j出现了几次。
- labelTrain:N*1向量,第i个元素表示第i篇训练文档的类别。
- countTest:M*V矩阵,第i行第j列表示第i篇测试文档中,单词j出现了几次。
Py = full(sparse(1, labelTrain, 1)) / length(labelTrain); % 各类的先验概率
Px_y = (sparse(labelTrain, 1:length(labelTrain), 1) * countTrain)' + alpha;
% 各类中各单词出现次数,alpha用作smoothing
Px_y = bsxfun(@rdivide, Px_y, sum(Px_y)); % 归一化,恨不能跟上一行合并
[~, labelTest] = max(bsxfun(@plus, countTest * log(Px_y), log(P_y)), [], 2);
% 每篇测试文档的类别
我来发两个soeasy的。
蒙特卡洛法求pi
画蝴蝶曲线
蒙特卡洛法求pi
N=1000;%总粒子数
S=sqrt(rand(1,N).^2+rand(1,N).^2);%距离原点距离数列
NC=size(find(S<1),2);%求出数量
PPI=NC*4/N;%求出圆周率并且记录
画蝴蝶曲线
function [dy]=odefun(t,y)
dy=zeros(3,1);
dy(1)=-10*y(1)+10*y(2);
dy(2)=28*y(1)-y(2)-y(1)*y(3);
dy(3)=-8/3*y(3)+y(1)*y(2);
end
[t,y]=ode45(@odefun,[0 100],[0 0.1 0]);
plot3(y(:,1),y(:,2),y(:,3));
最近正在写一个仿真快速画图的GUI。
以下这段的功能是, 点一下按钮,就把打开了的Scope的图直接保存成jpg文件。
以前的话基本都是用截图工具,或者先把Scope的Menubar设置成可见,之后再Save as为图像。
删掉了备注,刚好十行,可却花了好几天的时间找如何定位到特定object的方法……
function quickSave_Callback(hObject, eventdata, handles)
set(0,'ShowHiddenHandles','On');
fig = findobj('Tag','SIMULINK_SIMSCOPE_FIGURE','-and','Visible','on');
numberOfOpenScope = size(fig,1);
for i = 1:numberOfOpenScope
set(fig(i),'PaperPositionMode','auto');
F = getframe(fig(i));
[filename,pathname] = uiputfile({'*.jpg';,'*.bmp';,'*.png';},'Save file name');
imwrite(F.cdata,[pathname,filename]);
end
前几天正在研究如何可以一键把scope快速保存成fig文件,真的是试了好多方法都失败了。
在不设置scope保存到workspace的情况下,怎么提取到那些信号的数据。fig的属性全看完了也没有找到,model的workspace也没有找到。
然后昨天发现,Simulink最新版就自带这个快捷的功能。
以下这段的功能是, 点一下按钮,就把打开了的Scope的图直接保存成jpg文件。
以前的话基本都是用截图工具,或者先把Scope的Menubar设置成可见,之后再Save as为图像。
删掉了备注,刚好十行,可却花了好几天的时间找如何定位到特定object的方法……
function quickSave_Callback(hObject, eventdata, handles)
set(0,'ShowHiddenHandles','On');
fig = findobj('Tag','SIMULINK_SIMSCOPE_FIGURE','-and','Visible','on');
numberOfOpenScope = size(fig,1);
for i = 1:numberOfOpenScope
set(fig(i),'PaperPositionMode','auto');
F = getframe(fig(i));
[filename,pathname] = uiputfile({'*.jpg';,'*.bmp';,'*.png';},'Save file name');
imwrite(F.cdata,[pathname,filename]);
end
前几天正在研究如何可以一键把scope快速保存成fig文件,真的是试了好多方法都失败了。
在不设置scope保存到workspace的情况下,怎么提取到那些信号的数据。fig的属性全看完了也没有找到,model的workspace也没有找到。
然后昨天发现,Simulink最新版就自带这个快捷的功能。
一条语句就可以做文字识别:
ocrobj = ocr(imread('businessCard.png'));
ocrobj.Text
‘ MathWorks®
The Mathworks, Inc.
3 Apple Hill Drive
Natick, MA 01760-2098
USA
www. mathworkscom
ocrobj = ocr(imread('businessCard.png'));
ocrobj.Text
‘ MathWorks®
The Mathworks, Inc.
3 Apple Hill Drive
Natick, MA 01760-2098
USA
www. mathworkscom