1. 程式人生 > >MatLab對影象處理計算機視覺有用的小函式

MatLab對影象處理計算機視覺有用的小函式

部落格上有不少人造輪子,明明一句話就能解決的事,非得花一上午的時間去for迴圈??這是初學資料結構的萌新的做法,如果你已經編寫了足夠程式碼,還是特別喜歡for迴圈去,那你用什麼時間看論文,做研究呢?所以我想收集一些有用的函式。

  • 看你的標籤中是否包含某一類:
A = ismember(Label, 12);

label是否包含第12類。

會返回一個矩陣

  • 看你的標籤怎麼分割你的圖片的。
BW = boundarymask(Label);
imshow(imoverlay(RGB,BW,'cyan'),'InitialMagnification',67);

上圖:

後一句的效果是視覺化:

為什麼會這樣,因為這就是我要的效果。嗯具體的在我結課後會跟著程式碼一塊放出來。

  • 下采樣可以用
B=A(1:2:100,1:2:100)

對A下采樣,間隔2取樣。最後賦值給B

  • 然後上取樣居然都是補零的所以我自己寫了一個
for i = 1:1:150
    for j = 1:1:240
        B((i-1)*8+1:(i-1)*8+9,(j-1)*8+1:(j-1)*8+9)=Visit1(i,j);
    end
end

辣雞作者,居然使用for迴圈。

對不起我無能為力了各位,我是真找不著函式,有知道的可以告訴我,提高下我對matlab的理解

連線兩個字串 : 

str = ['a','b'];

數字轉換成string

num2str(23,'%4d');

數值陣列轉換成string,不能用上面函式,即使用for依舊會造成混亂,我不知道為什麼。明明除錯moment,num2str(Label)輸出單個元素,比如3,但是如果有個東西在左邊等著賦值,並且有個for迴圈,就會變成整個字串比如1111222333444賦值給a

A = sprintfc('%g',Label);

根據樣本的標籤,畫彩色散點圖

numlabel儲存的是標籤

scatter(Y(:,1),Y(:,2),'filled','cdata',numlabel);

trLabel儲存的是標籤,是double

for i =1 : length(trLabel)
 c = trLabel(i)/15;
scatter(Y(i,1),Y(i,2),'filled','cdata',[min(c+1/16,1) min(c-1/16,1) min(1-c,1)]);
hold on;
end

Y第一列儲存橫座標,第二列儲存縱座標。

如果想要自己配色,可以這樣:

% for i = 1:length(Y(:,1))
%     scatter(Y(:,1),Y(:,2),4,'MakerFaceColor',[trLabel(:)/20,0.5,0.5]);
%     %plot(Y(i,1),Y(i,2),'--rs','MarkerFaceColor','1','Color',[.trLabel(i)*20 25 25]);
% end
c = ['y' 'r' 'c' 'w' 'k' 'b' 'g' 'm'];
for i =1 : length(trLabel)
    if numlabel(i)<=8
        scatter(Y(i,1),Y(i,2),c(numlabel(i)))
        hold on;
    elseif numlabel(i) == 9
        scatter(Y(i,1),Y(i,2),'filled','cdata',[0.5 0.5 0.5]);
        hold on;
    elseif numlabel(i) == 10
        scatter(Y(i,1),Y(i,2),'filled','cdata',[0.1 0.9 0.5]);
        hold on;
    elseif(numlabel(i) == 11)
                scatter(Y(i,1),Y(i,2),'filled','cdata',[0.3 0,0.7]);
                hold on;
    elseif(numlabel == 12)
                    scatter(Y(i,1),Y(i,2),'filled','cdata',[0.9 0 0.5]);
                    hold on;
    else 
         scatter(Y(i,1),Y(i,2),'filled','cdata',[0.9 0.9 0.5]);              
         hold on;
                
    end
    
end

樣本點只有邊緣上色,空心圓,nz是空心圓大小。後面的三個[x y z]是顏色,取值範圍[0,1].如果在最後面加了'd'那就是菱形了。

scatter(Y(i,1),Y(i,2),nz,'MarkerEdgeColor',[0.5 0.5 0.5],'d');

事實上除了功能性函式,還有計算型函式更加的重要,要完成一個計算公式,不同的函式會使用不同的記憶體,不同的方式,也有不同的完成時間,不同的表達形式。

舉個例子:如果用for迴圈完成bsxfun的功能就會花更多的時間。

而2016版之後直接拋棄的bsxfun函式,兩個不同維度的矩陣,張量,是直接可以相加相乘,各種操作的。

所以,找到最簡便的方法就很重要。