當前位置:首頁 » 操作系統 » 拆分演算法庫

拆分演算法庫

發布時間: 2023-03-18 03:15:48

⑴ 自然數拆分演算法,pascal高手請進

完整程序如下,上機調試通過,保證運行正確,每個空的位置在程序中用{(1)}~{(5)}標明,相應位置的語句就是罩坦你的答案:
{$apptype console}
program ex4;
const m=100;
var
s:array[1..m] of 0..m;
n,I,j,sum,count: integer;
procere print ;
var
k :integer;
begin
count:=count+1;
write(count,':',n,'=',s[1]);
for k:=2 to I do write('+',s[k]);
writeln;
end;

begin
write('Input n:');readln(n);
i:=1;{(1)}sum:=0;j:=0;count:=0;
writeln('output data:');
repeat
j:=j+1;
sum:=sum+j; {(2)}
if sum<=n{(3)} then begin
s[I]:=j;
if sum =n then begin
print;
sum:=sum-s[I];
i:=I-1;
sum:=sum-s[i]; {(4)}
j:=s[I]
end
else begin
i:=I+1;
j:=j-1; {(5)}
end
end
else begin
sum:=sum-j;
i:=I-1;
sum:=sum-s[I];
j:=s[i];
end
until I=0;
end.

我為什麼要粘貼完整程序,因為你打字有錯誤,每個空是否包含分號的問題可能導致答案與標准答案不完全一致,我下面把5個空白的內容整理如下,都不包含語句的分號:
(1)i:=1
(2)sum:=sum+j
(3)sum<=n
(4)sum:=sum-s[i]
(5)j:=j-1

通過高級程序員考試快10年了,現在做這類物禪桐題目已經沒有當初的襲侍熟練了,不得不服老呀。

⑵ 離婚房產分割計算方法一覽表

婚房產分割計算方法有兩種計算方式:
1、由分得房產一方負責償還剩餘銀行貸款及利息,並給付另一方的補償房款,計算公式為:(房屋行圓增值 已支付房款)×50%。
2、由分得房產一方負責償還剩餘銀行貸款及利息,並給付另一方的補償房款,計算公式為:(房屋現值-尚欠銀行按揭貸款)×50%,房屋現值可由評估機構評估,也可由夫妻雙方同意確認。
1、對於一方婚前以全款購買,婚後取得房產證的房屋,屬於一方的婚前個人財產,離婚時,該房屋不參與分割。
2、一方婚前以個人財產出首付,婚後雙方共同還貸的房屋,離婚時仍屬於一方的婚前財產,但產權人應當就婚內共同還貸及對應的增值部分,給予另一方補償。
3、對於一方婚後,以個人婚前財產出全資購買的房屋,在離婚時,應當析出個人婚前財產部分,對於房屋的增值部分作為夫妻共同財產均等分割。
4、婚後一方以個人財產和夫妻共同財產混合出資的,該房屋屬於夫妻共同財產,在析出個人婚前財產部分後由夫妻雙方均等分割。
離婚時的資產演算法:
個人資產不予分割,當事人另有約定的除外。共同資產由雙方協議處理。如果協議不成的,由人民法院根據財產的具體情況,按照照顧子女、女方和無過錯方權益的原則判決。債務的演算法:個人債務由債務人自行承擔,雙方另有約定的除外。夫妻共同債務應當共同清償。

法律依據:
《最高人民法院關於適用〈中華人民共和國民法典〉婚姻家庭編的解釋(一)》
第七十六條 雙方對夫妻共同財產中的房屋價值及歸屬無法達成協議時,人民法院按以下情形分別處理:
(一)雙方均主張房屋所有權並且同意競價取得的,應當准許;
(二)一方主張房屋所有權的,由評估機構按市場價格對房屋作出評估,取得房屋所有權的一方應當給予另一方相應的補償;
(三)雙方均不主張房屋所有權的,根據當事人的申請拍賣、變賣房屋,就廳閉所得價款進扮帶裂行分割。
第七十七條 離婚時雙方對尚未取得所有權或者尚未取得完全所有權的房屋有爭議且協商不成的,人民法院不宜判決房屋所有權的歸屬,應當根據實際情況判決由當事人使用。
當事人就前款規定的房屋取得完全所有權後,有爭議的,可以另行向人民法院提起訴訟。

⑶ 圖像分割演算法總結

       圖像處理的很多任務都離不開圖像分割。因為圖像分割在cv中實在太重要(有用)了,就先把圖像分割的常用演算法做個總結。

        接觸機器學習和深度學習時間已經不短了。期間看過各種相關知識但從未總結過。本文過後我會盡可能詳細的從工程角度來總結,從傳統機器學習演算法,傳統計算機視覺庫演算法到深度學習目前常用演算法和論文,以及模型在各平台的轉化,量化,服務化部署等相關知識總結。

        圖像分割常用演算法大致分為下面幾類。由於圖像的能量范函,邊緣追蹤等方法的效果往往只能解決特定問題,效果並不理想,這里不再闡述。當然二值化本身也可以分割一些簡單圖像的。但是二值化演算法較多,我會專門做一個文章來總結。這里不再贅述。

        1.基於邊緣的圖像分割演算法:

            有利用圖像梯度的傳統演算法運算元的sobel,roberts,prewitt,拉普拉斯以及canny等。

            這些演算法的基本思想都是採用合適的卷積運算元,對圖像做卷積。從而求出圖像對應的梯度圖像。(至於為什麼通過如圖1這樣的運算元卷積,即可得到圖像的梯度圖像,請讀者復習下卷積和倒數的概念自行推導)由於圖像的邊緣處往往是圖像像素差異較大,梯度較大地方。因此我們通過合適的卷積核得到圖像的梯度圖像,即得到了圖像的邊緣圖像。至於二階運算元的推導,與一階類似。優點:傳統運算元梯度檢測,只需要用合適的卷積核做卷積,即可快速得出對應的邊緣圖像。缺點:圖像邊緣不一定準確,復雜圖像的梯度不僅僅出現在圖像邊緣,可以能出現在圖像內部的色彩和紋理上。

             也有基於深度學習方法hed,rcf等。由於這類網路都有同一個比較嚴重的缺陷,這里只舉例hed網路。hed是基於FCN和VGG改進,同時引出6個loss進行優化訓練,通過多個層輸出不同scale的粒度的邊緣,然後通過一個訓練權重融合各個層的邊緣結果。hed網路結構如下:

可以得到一個比較完整的梯度圖像,可參考github的hed實現。優點:圖像的梯度細節和邊緣完整性,相比傳統的邊緣運算元要好很多。但是hed對於邊緣的圖像內部的邊緣並不能很好的區分。當然我們可以自行更改loss來嘗試只擬合外部的圖像邊緣。但最致命的問題在於,基於vgg的hed的網路表達能力有限,對於圖像和背景接近,或者圖像和背景部分相融的圖片,hed似乎就有點無能為力了。

        2.基於區域分割的演算法:

            區域分割比較常用的如傳統的演算法結合遺傳演算法,區域生長演算法,區域分裂合並,分水嶺演算法等。這里傳統演算法的思路是比較簡單易懂的,如果有無法理解的地方,歡迎大家一起討論學習。這里不再做過多的分析。

            基於區域和語意的深度學習分割演算法,是目前圖像分割成果較多和研究的主要方向。例如FCN系列的全卷積網路,以及經典的醫學圖像分割常用的unet系列,以及rcnn系列發展下的maskrcnn,以及18年底的PAnet。基於語意的圖像分割技術,無疑會成為圖像分割技術的主流。

            其中,基於深度學習語意的其他相關演算法也可以間接或直接的應用到圖像分割。如經典的圖像matting問題。18年又出現了許多非常優秀的演算法和論文。如Deep-Image-Matting,以及效果非常優秀的MIT的 semantic soft segmentation(sss).

            基於語意的圖像分割效果明顯要好於其他的傳統演算法。我在解決圖像分割的問題時,首先嘗試用了hed網路。最後的效果並不理想。雖然也參考github,做了hed的一些fine-tune,但是還是上面提到的原因,在我多次嘗試後,最終放棄。轉而適用FCN系列的網路。但是fcn也無法解決圖像和背景相融的問題。圖片相融的分割,感覺即需要大的感受野,又需要未相融部分原圖像細節,所以單原FCN的網路,很難做出准確的分割。中間還測試過很多其他相關的網路,但都效果不佳。考慮到感受野和原圖像細節,嘗試了resnet和densenet作為圖像特徵提取的底層。最終我測試了unet系列的網路:

                unet的原始模型如圖所示。在自己拍照爬蟲等手段採集了將近1000張圖片。去掉了圖片質量太差的,圖片內容太過類似的。爬蟲最終收集160多張,自己拍照收集200張圖片後,又用ps手動p了邊緣圖像,採用圖像增強變換,大約有300*24張圖片。原生unet網路的表現比較一般。在將unet普通的卷積層改為resnet後,網路的表達能力明顯提升。在將resnet改為resnet101,此時,即使對於部分相融的圖像,也能較好的分割了。但是unet的模型體積已經不能接受。

                在最後階段,看到maskrcnn的實例分割。maskrcnn一路由rcnn,fasterrcnn發展過來。於是用maskrcnn來加入自己的訓練數據和label圖像進行訓練。maskrcnn的結果表現並不令人滿意,對於邊緣的定位,相比於其他演算法,略顯粗糙。在產品應用中,明顯還不合適。                

        3.基於圖的分割演算法

            基於深度學習的deepgrab,效果表現並不是十分理想。deepgrab的git作者backbone採用了deeplabv2的網路結構。並沒有完全安裝原論文來做。

論文原地址參考: https://arxiv.org/pdf/1707.00243.pdf

整體結構類似於encode和decoder。並沒有太仔細的研究,因為基於resent101的結構,在模型體積,速度以及deeplab的分割精度上,都不能滿足當前的需求。之前大致總結過計算機視覺的相關知識點,既然目前在討論移動端模型,那後面就分模塊總結下移動端模型的應用落地吧。

由於時間實在有限。這里並沒有針對每個演算法進行詳細的講解。後續我會從基礎的機器學習演算法開始總結。

java實現整數拆分演算法,例如輸入一個4會輸出4 , 3 1, 2 2, 2 1

importjava.util.Scanner;//輸入的

publicclassABS{//外面建的點java的文件名必須和這個一樣


publicstaticinta[]=newint[12000];

staticvoidp(intn,intindex)//搜索
{

inti;
if(n<=0)//當n為0的時候輸出這種情況
{
System.out.print(a[0]);
for(i=1;i<index;System.out.print("+"+a[i++]));
System.out.print(" ");
return;//返回到函數調用的地方
手簡畝}
for(i=index>咐橘0&&(n>=a[index-1])?a[index-1]:n;i>0;i--)
{//如果數組下標大於0且n剩餘的值大於等於上一個的值,那麼i就等於上一個的值,否則i就等於n
a[index]=i;
p(n-i,index+1);//在次調用
}
}

publicstaticvoidmain(String[]args){

Scannerin=newScanner(System.in);//從控制台中讀取輸入數據
intt;
t=in.nextInt();//輸入一個整數
if(t>=10000)
{
System.out.println("你輸入的數據超過1萬,太大咯!!!");
return;
}
p(t,0);
in.close();//關閉輸入
return;
}
}

這個只是畢森可以實現10000 以內的數, 如果想大一點 就把數組開大一點局可以了!

⑸ 39乘81多種演算法拆分法

39*嫌友81
=(山者蘆逗帶40-1)*81
=3240-81
=3159
39*81
=39*(80+1)
=3120+39
=3159

⑹ java實現 整數拆分 希望有個演算法

我給你寫一個,要給分的呦。代碼如下:

import java.util.ArrayList;
import java.util.List;

public class Testxxx {
public void chaifen(int n){
List list = new ArrayList();
chaifendigui(n,list);
}
public void chaifendigui(int n, List list) {
// TODO Auto-generated method stub

for (int i = 1; i <= n; i++) {

System.out.print(i+" ");
if(n>i){
List list2 = new ArrayList();
list2.addAll(list);
list2.add(i);
chaifendigui(n-i,list2);
}else{
System.out.println();
for (int j = 0; j < list.size()-1; j++) {
System.out.print(list.get(j)+" ");
}
}

}
}
public static void main(String[] args) {
Testxxx xx = new Testxxx();
xx.chaifen(10);
}
}

⑺ dble是資料庫擴展名嗎

DBLE是一種分布式數據型明純庫。

  1. DBLE官方網站:槐凳https://opensource.actionsky.com

  2. DBLE官方項目:https://github.com/actiontech/dble

  3. DBLE下載地址:卜咐https://github.com/actiontech/dble/releases

⑻ 圖像分割——分水嶺演算法

姓名:謝意遠

學號:19021110366T

嵌牛導讀:圖像中的目標物體是連接在一起的,則分割起來很困難,分水嶺分割演算法經常用於處理這類問題,通常會取得比較好的效果。

嵌牛鼻子:圖像分割、分水嶺絕源演算法

嵌牛提問:分水嶺演算法具體有哪些步驟?

嵌牛正文:

一、綜述

分水嶺分割演算法把圖像看成一幅「地形圖」,其中亮度比較強的區域像素值較大,而比較暗的區域像素值較小,通過尋找「匯水盆地」和「分水嶺界限」,對圖像進行分割。而直接應用分水嶺分割演算法的效果往往並不好,如果在圖像中對前景對象和背景對象進行標注區別,再應用分水嶺演算法會取得較好的分割效果。基於標記控制的分水嶺分割方法有以下基本步驟:

1  綜述

分水嶺分割演算法把圖像看成一幅「地形圖」,其中亮度比較強的區域像素值較大,而比較暗的區域像素值較小,通過尋找「匯水盆地」和「分水嶺界限」,對圖像進行分割。直接應用分水嶺分割演算法的效果往往並不好,如果在圖像中對前景對象和背景對象進行標注區別,再應用分水嶺演算法會取得較好的分割效果。基於標記控制的分水嶺分割方法有以下基本步驟:

1.計算分割函數。圖像中較暗的區域是要分割的對象

2.計算前景標志。這些是並運態每個對象內部連接的斑點像素。

3.計算背景標志。這些是不屬於任何對象的要素。

4.修改分割函數,使其僅在前景和後景標記位置有極小值。

5.對修改後的分割函數做分水嶺變換計算。

使用MATLAB圖像處理工具箱

註:期間用到了很多圖像處理工具箱的函數,例如fspecial、imfilter、watershed、label2rgb、imopen、imclose、imreconstruct、imcomplement、imregionalmax、bwareaopen、graythresh和imimposemin函數等。

2  步驟

 第一步:讀入彩色圖像,將其轉化成灰度圖像

clc; clear all; close all;

rgb = imread('pears.png');

if ndims(rgb) == 3

 I = rgb2gray(rgb);

else

 I = rgb;

end

figure('units', 'normalized', 'position', [0 0 1 1]);

第2步:將梯度幅值作為分割函數

使用Sobel邊緣運算元對圖像進行水平和垂直方向的濾波,然後求取模值,sobel運算元濾波後的圖像在邊界處會顯示比較大的值,在沒有邊界處的值會很小。

hy = fspecial('sobel');

hx = hy';

Iy = imfilter(double(I), hy, 'replicate');

Ix = imfilter(double(I), hx, 'replicate');

gradmag = sqrt(Ix.^2 + Iy.^2);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(I,[]), title('灰度圖像')

subplot(1, 2, 2); imshow(gradmag,[]), title('梯度幅值圖像')

可否直接對梯度幅值圖像使用分水嶺演算法?

L = watershed(gradmag);

Lrgb = label2rgb(L);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(gradmag,[]), title('梯度幅值圖像')

subplot(1, 2, 2); imshow(Lrgb); title('梯度幅值做分水嶺變換')

直接使用梯度模值圖像進行分水嶺演算法得到的結果往往會存在過度分割的現悄指象。因此通常需要分別對前景對象和背景對象進行標記,以獲得更好的分割效果。

第3步:標記前景對象

有多種方法可以應用在這里來獲得前景標記,這些標記必須是前景對象內部的連接斑點像素。這個例子中,將使用形態學技術「基於開的重建」和「基於閉的重建」來清理圖像。這些操作將會在每個對象內部創建單位極大值,使得可以使用imregionalmax來定位。

開運算和閉運算:先腐蝕後膨脹稱為開;先膨脹後腐蝕稱為閉。開和閉這兩種運算可以除去比結構元素小的特定圖像細節,同時保證不產生全局幾何失真。開運算可以把比結構元素小的突刺濾掉,切斷細長搭接而起到分離作用;閉運算可以把比結構元素小的缺口或孔填充上,搭接短的間隔而起到連接作用。

開操作是腐蝕後膨脹,基於開的重建(基於重建的開操作)是腐蝕後進行形態學重建。下面比較這兩種方式。首先,用imopen做開操作。

se = strel('disk', 20);

Io = imopen(I, se);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(I, []); title('灰度圖像');

subplot(1, 2, 2); imshow(Io), title('圖像開操作')

接下來,通過腐蝕後重建來做基於開的重建計算。

Ie = imerode(I,se)

Iobr = imreconstruct(Ie,I);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(I, []); title('灰度圖像');

subplot(1, 2, 2); imshow(Iobr, []), title('基於開的重建圖像')

開操作後,接著進行閉操作,可以移除較暗的斑點和枝幹標記。對比常規的形態學閉操作和基於閉的重建操作。首先,使用imclose:

Ioc = imclose(Io, se);

Ic = inclose(I,se);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(I, []); title('灰度圖像');

subplot(2, 2, 2); imshow(Io, []); title('開操作圖像');

subplot(2, 2, 3); imshow(Ic, []); title('閉操作圖像');

subplot(2, 2, 4); imshow(Ioc, []), title('開閉操作');

現在使用imdilate,然後使用imreconstruct。注意必須對輸入圖像求補,對imreconstruct輸出圖像求補。IM2 = imcomplement(IM)計算圖像IM的補集。IM可以是二值圖像,或者RGB圖像。IM2與IM有著相同的數據類型和大小。

Iobrd = imdilate(Iobr, se);

Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));

Iobrcbr = imcomplement(Iobrcbr);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(I, []); title('灰度圖像');

subplot(2, 2, 2); imshow(Ioc, []); title('開閉操作');

subplot(2, 2, 3); imshow(Iobr, []); title('基於開的重建圖像');

subplot(2, 2, 4); imshow(Iobrcbr, []), title('基於閉的重建圖像');

通過比較Iobrcbr和loc可以看到,在移除小污點同時不影響對象全局形狀的應用下,基於重建的開閉操作要比標準的開閉重建更加有效。計算Iobrcbr的局部極大來得到更好的前景標記。

fgm = imregionalmax(Iobrcbr);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 3, 1); imshow(I, []); title('灰度圖像');

subplot(1, 3, 2); imshow(Iobrcbr, []); title('基於重建的開閉操作');

subplot(1, 3, 3); imshow(fgm, []); title('局部極大圖像');

為了幫助理解這個結果,疊加前景標記到原圖上。

It1 = rgb(:, :, 1);

It2 = rgb(:, :, 2);

It3 = rgb(:, :, 3);

It1(fgm) = 255; It2(fgm) = 0; It3(fgm) = 0;

I2 = cat(3, It1, It2, It3);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(rgb, []); title('原圖像');

subplot(2, 2, 2); imshow(Iobrcbr, []); title('基於重建的開閉操作');

subplot(2, 2, 3); imshow(fgm, []); title('局部極大圖像');

subplot(2, 2, 4); imshow(I2); title('局部極大疊加到原圖像');

注意到大多閉塞處和陰影對象沒有被標記,這就意味著這些對象在結果中將不會得到合理的分割。而且,一些對象的前景標記會一直到對象的邊緣。這就意味著應該清理標記斑點的邊緣,然後收縮它們。可以通過閉操作和腐蝕操作來完成。

se2 = strel(ones(5,5));

fgm2 = imclose(fgm, se2);

fgm3 = imerode(fgm2, se2);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(Iobrcbr, []); title('基於重建的開閉操作');

subplot(2, 2, 2); imshow(fgm, []); title('局部極大圖像');

subplot(2, 2, 3); imshow(fgm2, []); title('閉操作');

subplot(2, 2, 4); imshow(fgm3, []); title('腐蝕操作');

這個過程將會留下一些偏離的孤立像素,應該移除它們。可以使用bwareaopen,用來移除少於特定像素個數的斑點。BW2 = bwareaopen(BW,P)從二值圖像中移除所以少於P像素值的連通塊,得到另外的二值圖像BW2。

fgm4 = bwareaopen(fgm3, 20);

It1 = rgb(:, :, 1);

It2 = rgb(:, :, 2);

It3 = rgb(:, :, 3);

It1(fgm4) = 255; It2(fgm4) = 0; It3(fgm4) = 0;

I3 = cat(3, It1, It2, It3);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(I2, []); title('局部極大疊加到原圖像');

subplot(2, 2, 2); imshow(fgm3, []); title('閉腐蝕操作');

subplot(2, 2, 3); imshow(fgm4, []); title('去除小斑點操作');

subplot(2, 2, 4); imshow(I3, []); title('修改局部極大疊加到原圖像');

第4步:計算背景標記

現在,需要標記背景。在清理後的圖像Iobrcbr中,暗像素屬於背景,所以可以從閾值操作開始。

bw =im2bw(Iobrcbr, graythresh(Iobrcbr));

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(Iobrcbr, []); title('基於重建的開閉操作');

subplot(1, 2, 2); imshow(bw, []); title('閾值分割');

背景像素在黑色區域,但是理想情形下,不必要求背景標記太接近於要分割的對象邊緣。通過計算「骨架影響范圍」來「細化」背景,或者SKIZ,bw的前景。這個可以通過計算bw的距離變換的分水嶺變換來實現,然後尋找結果的分水嶺脊線(DL==0)。D = bwdist(BW)計算二值圖像BW的歐幾里得矩陣。對BW的每一個像素,距離變換指定像素和最近的BW非零像素的距離。bwdist默認使用歐幾里得距離公式。BW可以由任意維數,D與BW有同樣的大小。

D = bwdist(bw);

DL = watershed(D);

bgm = DL == 0;

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2, 2, 1); imshow(Iobrcbr, []); title('基於重建的開閉操作');

subplot(2, 2, 2); imshow(bw, []); title('閾值分割');

subplot(2, 2, 3); imshow(label2rgb(DL), []); title('分水嶺變換示意圖');

subplot(2, 2, 4); imshow(bgm, []); title('分水嶺變換脊線圖');

第5步:計算分割函數的分水嶺變換

函數imimposemin可以用來修改圖像,使其只是在特定的要求位置有局部極小。這里可以使用imimposemin來修改梯度幅值圖像,使其只在前景和後景標記像素有局部極小。

gradmag2 = imimposemin(gradmag, bgm | fgm4);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(2,2,1)imshow(bgm,[]);title('分水嶺變換脊線圖');

subplot(2, 2, 2); imshow(fgm4, []); title('前景標記');

subplot(2, 2, 3); imshow(gradmag, []); title('梯度幅值圖像');

subplot(2, 2, 4); imshow(gradmag2, []); title('修改梯度幅值圖像');

最後,可以做基於分水嶺的圖像分割計算。

第6步:查看結果

一個可視化技術是疊加前景標記、背景標記、分割對象邊界到初始圖像。可以使用膨脹來實現某些要求,比如對象邊界,更加清晰可見。對象邊界定位於L==0的位置。

It1 = rgb(:, :, 1);

It2 = rgb(:, :, 2);

It3 = rgb(:, :, 3);

fgm5 = imdilate(L == 0, ones(3, 3)) | bgm | fgm4;

It1(fgm5) = 255; It2(fgm5) = 0; It3(fgm5) = 0;

I4 = cat(3, It1, It2, It3);

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(rgb, []); title('原圖像');

subplot(1, 2, 2); imshow(I4, []); title('標記和對象邊緣疊加到原圖像');

可視化說明了前景和後景標記如何影響結果。在幾個位置,部分的較暗對象與它們相鄰的較亮的鄰接對象相融合,這是因為受遮擋的對象沒有前景標記。

另外一個有用的可視化技術是將標記矩陣作為彩色圖像進行顯示。標記矩陣,比如通過watershed和bwlabel得到的,可以使用label2rgb轉換到真彩圖像來顯示。

Lrgb = label2rgb(L,'jet', 'w', 'shuffle');

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(rgb, []); title('原圖像');

subplot(1, 2, 2); imshow(Lrgb); title('彩色分水嶺標記矩陣');

可以使用透明度來疊加這個偽彩色標記矩陣在原亮度圖像上進行顯示。

figure('units', 'normalized', 'position', [0 0 1 1]);

subplot(1, 2, 1); imshow(rgb, []); title('原圖像');

subplot(1, 2, 2); imshow(rgb, []); hold on;

himage = imshow(Lrgb);

set(himage, 'AlphaData', 0.3);

title('標記矩陣疊加到原圖像');

⑼ 使用 sklearn 庫中的 KMeans 實現彩色圖像聚類分割

sklearn 庫是最為常用且經典的機器學習庫,裡面封裝了許多機器學習演算法,此篇文章使用此庫中的 KMeans 演算法,從而實現圖像的聚類分割。

本文不講理論,只談應用。

除了 sklearn 庫之外,還需要一些圖像處理的庫,我引入了如下幾個庫:

我使用了 pylab 庫來讀入圖片:

此時讀入的 img 是一個三維 numpy 數組,其形狀為 (height, width, 3) ,其中3是指通道數,即 RGB 三個通道。

但是, KMeans 傳入的參數必須是二維數組,故,還需要將其打散為二維:

在此構建時,只需要使用最簡單的方法即可:

參數有很多,我在構建的時候除了 n_clusters 都使用的默認值:

然後,使用 fit() 進行訓練山滾:

聚類之後,有很多參數,比較重要的,以及此處需要用到的主要有倆:

聚類完成之後,需要將每個像素點重新填色,將同一類的像素點均填為此類聚類中心的顏色。

在此之前,首先需要得到圖片的高度和寬度:

首先用 image.new() 重新創建一個圖片,其語法如下:

然後需要用 putpixel() 方如滲法來填充像素,但是在此之前,還需要處理幾個小細渣唯脊節:

RGB圖中,每個通道都是 0-255 之間的整數,但是, kmeans.cluster_centers_ 中元素類型卻是 float64 ,故在填充之前,還需要小小處理一番,將元素變為 int32 類型的。

直接轉變類型不太合適,因為 kmeans.cluster_centers_ 畢竟是類似於一個屬性值的東西,而且這個名字太長,換一個簡短的也是好的。故重新復制一份再使用 astype 更改數據類型即可。

上面便提到, kmeans.labels_ 是一個一維數組,但是圖片是二維的,所以將其恢復過來即可:

然後便可以 填充像素 了:

這里需要注意 putpixel() 方法,其的兩個參數:

最後保存圖片即可:

我使用了王者榮耀大喬的圖片來做測試:

熱點內容
實用演算法試題 發布:2025-08-25 05:37:50 瀏覽:786
網路用語腳本 發布:2025-08-25 05:23:45 瀏覽:193
畢業mv腳本 發布:2025-08-25 05:22:56 瀏覽:812
對象存儲使用場景 發布:2025-08-25 04:55:09 瀏覽:490
裝wf鎖了一般原始密碼是多少 發布:2025-08-25 04:40:14 瀏覽:357
sql轉mysql 發布:2025-08-25 04:40:12 瀏覽:882
交互性編程 發布:2025-08-25 04:33:01 瀏覽:961
編譯器一般多少行代碼 發布:2025-08-25 04:32:28 瀏覽:769
asp班級源碼 發布:2025-08-25 04:28:06 瀏覽:504
python連接redis集群 發布:2025-08-25 03:52:28 瀏覽:860