十行以內,你寫過哪些比較酷的 Matlab 代碼?

每行不要超過80字元

十行以內,你寫過哪些比較酷的Python代碼? - 編程

十行以內,你寫過哪些比較酷的Mathematica代碼? - Wolfram Mathematica


一鍵磨皮。。。

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

%% 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;

http://www.klab.caltech.edu/~xhou/projects/spectralResidual/spectralresidual.html

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")
效果如下:

直接貼上列印沒問題!當時就覺得沒有更酷的了!


A(A&<0) = 0;

我也說個,比不上其他回答里功能那麼高端,剛搬磚時候正好用到,可以把矩陣A中所有負數元素都替換為0。


一條語句就可以做文字識別:
ocrobj = ocr(imread("businessCard.png"));

ocrobj.Text『 MathWorks?
The Mathworks, Inc.
3 Apple Hill Drive
Natick, MA 01760-2098
USA
www. mathworkscom


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-


一個函數,程序跑完自動發個郵件給自己,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


稍微多了幾行,但是效果可能會好一些
[X, Y] = meshgrid(0.01:0.01:1, 0.01:0.01:1);
Zfun =@(x,y)12.5*x.*log10(x).*y.*(y-1)+exp(-((25 ...
*x - 25/exp(1)).^2+(25*y-25/2).^2).^3)./25;
Z = Zfun(X,Y);
figure;
surf(Y,Z,X,"FaceColor",[1 0.75 0.65],"linestyle","none");
hold on
surf(Y+0.98,Z,X,"FaceColor",[1 0.75 0.65],"linestyle","none");
axis equal;
view([116 30]);
camlight;
lighting phong; % 設置光照和光照模式

參看:怎麼樣的乳房是完美的? - 兩性關係@江曦


當年機器學習課的一次作業,用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);
% 每篇測試文檔的類別


logo

看完用完覺得吊的別光感謝完事
請點贊,么么這個噠


常年專註寫短代碼的人飄過。感謝 @井號鍵 的提及和關注。希望今後能寫更多短代碼 paper 給各位看官 :-)

剛剛看到另外一個有趣的問題,各個數位都不含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(:)))


=============================我又來更新了===============================
====================這次也不超過十行,上了顏色=============================

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;


char([73 32 119 97 110 116 32 97 32 103 105 114 108 32 102 114 105 101 110 100 46 46 46])


for i=1:25
why
end


[x,t] = meshgrid(0:0.1:1,-1:.03:30);
p = (pi/2)*exp(-t/8);
u = 1-(1-mod(3.6*t,2)).^4/2;
y = 2*(x.^2-x).^2.*sin(p);
r = u.*(x.*sin(p)+y.*cos(p));
figure("color","w"),view(70,70),axis image off
surface(r.*cos(t*pi),r.*sin(t*pi),...
u.*(x.*cos(p)-y.*sin(p)),"EdgeColor","none","FaceColor","r")
light("style","local","pos",[1 -1 3]),lighting gouraud


聽說之前隔壁實驗室寫的裸眼2d戴眼鏡3d的matlab代碼一共7行,一行1w賣給sony了。。


最近正在寫一個模擬快速畫圖的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最新版就自帶這個快捷的功能。


強烈鄙視這些追求代碼短的,估計大多數人根本不懂Matlab內存分配的原理。

搞搞大矩陣的計算就知道了,把兩行代碼精簡成一行會直接造成out of memory。
你們要是覺得 A=B*(C*D) 和 A=C*D;A=B*A;一樣,你們就naive了。


雖然超過十行了,但是我想分享一段機器學習方面的小代碼,可以在二維平面上畫出任意分類器的分類區域,本質上就是網格採樣,然後對採樣點進行分類,最後用分類 label 作為 colormap。

function visualize2DModel(xrange, yrange, step, clf, colors)
% 在二維平面上畫分類面
% xrange : x 坐標的範圍 [low high]
% yrange : y 坐標的範圍 [low high]
% step : 在範圍內的採樣步長
% clf : 函數對象,輸入一組數據(按行排列),輸出分類 label (可以是多類)
% colors : 可選的顏色參數,傳入一個 N 行 3 列的矩陣,代表 N 種 RGB 顏色

% 生成顯示範圍內的網格採樣點
[xs, ys] = meshgrid(xrange(1):step:xrange(2), yrange(1):step:yrange(2));
xy = [xs(:) ys(:)];

% 對採樣點進行分類,得到分類結果
dec = clf(xy);
decMap = reshape(dec, size(xs));
types = numel(unique(dec));

if (nargin ~= 5)
colors = hsv(100);
idx = randperm(100);
colors = colors(idx, :);
colors = colors(1:types, :);
colors = min(colors + 0.6, 1);
elseif (size(colors, 1) ~= types)
error("顏色和類型數不符");
end

imagesc(xrange, yrange, decMap);
hold on;
set(gca,"ydir","normal");
colormap(colors);

hold off;

end

使用方法是(以 libsvm 為例)

% 學習一個圓

d = sqrt(5) * randn(200, 2);
idx = d(:,1) .^ 2 + d(:,2) .^ 2 &< 4; d1 = d(idx, :); d0 = d(~idx, :); % 訓練 RBF SVM model = svmtrain([zeros(size(d0,1),1); ones(size(d1,1),1)], [d0; d1]); % 畫分類面 visualize2DModel([-5 5],[-5 5], 0.1,... @(d)(svmpredict(zeros(size(d,1),1), d, model)),... [1,0.7,0.7; 0.7,0.7,1;]); % 淺紅和淺藍色 % 畫數據點 hold on; scatter(d0(:,1), d0(:, 2), 12*ones(size(d0,1),1), "filled", "MarkerFaceColor", "red"); hold on; scatter(d1(:,1), d1(:, 2), 12*ones(size(d1,1),1), "filled", "MarkerFaceColor", "blue");

輸出效果如下

可以用來畫示意圖或者做小測試。


推薦閱讀:

如何評價 Kaiming He 在 ICCV 2017 上拿下雙 Best 的 paper?
寫一個操作系統內核有多難?大概的內容、步驟是什麼?
iPhone 5s 配備的 A7 處理器是 64 位,意味著什麼?
CPU 的摩爾定律是不是因為 10 納米的限制已經失效了?10 納米之後怎麼辦?
為什麼計算機能讀懂 1 和 0 ?

TAG:演算法 | 編程 | 科研 | MATLAB | 計算機科學 |