❶ java blob
java blob是什麼,讓我們一起了解一下?
Blob是計算機視覺圖像中的一塊連通區域,Blob分析的就是對前景或背景分離後的二值圖像,進行連通域提取和標記以及計算Blob的一些相關特徵,而且通過Blob提取,還可以獲得相關區域的信息。
Blob分析的重要一個步驟是連通區域的確定,那麼它的優缺點是什麼?
優點:
Blob在目標跟蹤的優勢有:
1、通過Blob提取,可以獲得相關區域的信息,這些信息可以作為邊緣監測器或者角點檢測器的補充信息。在目標識別中,Blob可以提供局部的統計信息和外貌信息,這些信息能夠為目標識別和跟蹤提供依據。
2、可以利用Blob對直方圖進行峰值檢測。
3、Blob還可以作為紋理分析和紋理識別的基元。
4、通過Blob分析,可以得到目標的個數及其所在區域,在進行目標匹配時,不需要對全局圖像進行搜索。
缺點:
1、速度過慢,要整個區域作逐點掃描。
2、Blob分析難度大。這是一純幾何學上的問題,一個不規則的形狀,如何計算它的面積、大小沒有簡單易行的演算法,太過復雜,運算時間就長,速度就更慢了。
3、實際應用。Blob演算法在實際應用中,非常依賴光源。幾乎可以說,Blob演算法如果離開了一個可靠的光源設計,則完全不起作用。
那麼java是怎樣對Blob讀寫的?示例如下:
package com.you.sister; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Properties; public class BlobTest { public static Connection conn; public static Connection getConn() throws Exception { FileInputStream fis = new FileInputStream(new File("jdbc.properties")); Properties prop = new Properties(); prop.load(fis); String driver = prop.getProperty("jdbc.driver"); String url = prop.getProperty("jdbc.url"); String username = prop.getProperty("jdbc.username"); String password = prop.getProperty("jdbc.password"); Class.forName(driver); return DriverManager.getConnection(url, username, password); } public static void main(String[] args) throws Exception { conn = getConn(); readBlob(); writeBlob(); conn.close(); } /** * 從資料庫中讀大對象出來 * 保存在本地 */ public static void readBlob() { try { String readSql = "select * from emp where empno = ?"; PreparedStatement ps = conn.prepareStatement(readSql); ps.setInt(1, 7369); ResultSet rs = ps.executeQuery(); while (rs.next()) { Blob image = rs.getBlob("image"); DataOutputStream dos = // 在FileOutputStream中指定文件輸出路徑 new DataOutputStream(new FileOutputStream(7369 + "_image.jpeg")); InputStream fis = image.getBinaryStream(); int out; byte[] outByte = new byte [100]; // 將blob對象輸入流寫入本地輸出流中 while ((out = fis.read(outByte)) != -1) { dos.write(outByte); } fis.close(); dos.flush(); dos.close(); } rs.close(); ps.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 將大對象文件保存進資料庫中 */ public static void writeBlob() { try { BufferedInputStream fis = new BufferedInputStream(new FileInputStream(new File("D:\\Tulips.jpg"))); // 如果是新插入欄位,則將大對象對應欄位插入為empty_clob(); // 如果是修改,則可以先update 該行數據,將大對象對應欄位設置為empty_clob(); String writeSql = "select * from emp where empno = ? for update"; PreparedStatement ps = conn.prepareStatement(writeSql); ps.setInt(1, 7499); conn.setAutoCommit(false); ResultSet rs = ps.executeQuery(); while (rs.next()) { oracle.sql.BLOB image = (oracle.sql.BLOB)rs.getBlob("image"); BufferedOutputStream bos = new BufferedOutputStream(image.getBinaryOutputStream()); int c; // 將實際文件中的內容以二進制的形式來輸出到blob對象對應的輸出流中 while ((c = fis.read()) != -1) { bos.write(c); } fis.close(); bos.close(); } conn.commit(); rs.close(); ps.close(); } catch (Exception e) { e.printStackTrace(); } } }
❷ 怎麼用java實現圖中的數據結構
用編程實現圖的存儲一般有常見的有兩種方式,第一種是鄰接鏈表、第二種就是鄰接矩陣。
鄰接鏈表就是將圖中的每一個點都單獨作為一個單獨鏈表的起點,為每個頂點保存一個鏈表。鏈表的每一個節點都記錄了與之相鄰的節點的信息。
鄰接矩陣就是將圖轉換成一個二維數組,數組的x和y均表示圖中每個節點到其他節點的連接狀況,能連通用一種狀態表示,不能連通用另外一中方式表示,這樣就形成了一個笛卡爾積。也就是一個二維數組。
❸ java代碼怎麼實現計算圖像二值連通區域的質心
一:幾何距(Geometric Moments)知識與質心尋找原理
1. Image Moments是圖像處理中非常有用的演算法,可以用來計算區域圖像的質心,方向等幾何特性,同時Mpq的高階具有旋轉不變性,可以用來實現圖像比較分類,正是因為Moments有這些特性,很多手繪油畫效果也會基於該演算法來模擬實現。它的數學表達為:
它的低階M00,M01, M10可以用來計算質心,中心化以後M11,M02,M20可以用來計算區域的方向/角度
2. 什麼是質心
就是通過該點,區域達到一種質量上的平衡狀態,可能物理學上講的比較多,簡單點的說就是規則幾何物體的中心,不規則的可以通過掛繩子的方法來尋找。
二:演算法流程
1. 輸入圖像轉換為二值圖像
2. 通過連通組件標記演算法找到所有的連通區域,並分別標記
3. 對每個連通區域運用計算幾何距演算法得到質心
4. 用不同顏色繪制連通區域與質心,輸出處理後圖像
三:演算法效果
左邊為原圖, 右邊藍色為連通組件標記演算法處理以後結果,白色點為質心
四:關鍵代碼解析
1. 計算幾何距演算法代碼
doublem00 = moments(pixels, width, height, 0, 0);
doublexCr = moments(pixels, width, height, 1, 0) / m00;// row
doubleyCr = moments(pixels, width, height, 0, 1) / m00;// column
return new double[]{xCr, yCr};
❹ 判斷有向圖是否連通+dfs+java
方法1:
如果存在迴路,則必存在一個子圖,是一個環路。環路中所有頂點的度>=2。
n演算法:
第一步:刪除所有度<=1的頂點及相關的邊,並將另外與這些邊相關的其它頂點的度減一。
第二步:將度數變為1的頂點排入隊列,並從該隊列中取出一個頂點重復步驟一。
如果最後還有未刪除頂點,則存在環,否則沒有環。
n演算法分析:
由於有m條邊,n個頂點。
i)如果m>=n,則根據圖論知識可直接判斷存在環路。(證明:如果沒有環路,則該圖必然是k棵樹 k>=1。根據樹的性質,邊的數目m = n-k。k>=1,所以:m<n)
ii)如果m<n 則按照上面的演算法每刪除一個度為0的頂點操作一次(最多n次),或每刪除一個度為1的頂點(同時刪一條邊)操作一次(最多m次)。這兩種操作的總數不會超過m+n。由於m<n,所以演算法復雜度為O(n)。