FPGA圖像處理(六)------ 圖像腐蝕and圖像膨脹

默認迭代次數為1,只進行一次腐蝕、膨脹

一、圖像腐蝕

1.相關定義?

2.圖像腐蝕效果圖

?

3.fpga實現?

彩色圖像灰度化,灰度圖像二值化,圖像緩存生成濾波模塊(3*3),圖像腐蝕算法

`timescale 1ns / 1ps
//
// Description: 圖像腐蝕 (前景色是黑色(0),背景色是白色(1)  腐蝕黑色)
//
module image_erode(input wire           clk             ,input wire           reset           ,input wire [10:0]    img_width       ,input wire [9:0]     img_height      ,input wire           valid_i         ,input wire [23:0]    last_line_data  ,input wire [23:0]    cur_line_data   ,input wire [23:0]    next_line_data  ,output reg           valid_o         ,output reg [23:0]    img_data_o
);//常量聲明parameter N = 3; //窗口大小//結構系數模版為{1,1,1,//              1,1,1,//              1,1,1}//變量聲明reg         valid_d1;reg [23:0]  last_line_data_d1, last_line_data_d2;reg [23:0]  cur_line_data_d1 , cur_line_data_d2 ;reg [23:0]  next_line_data_d1, next_line_data_d2;//中心點位置,為cur_line_data_d1always@(posedge clk or posedge reset) beginif(reset) beginvalid_d1 <= 0;{last_line_data_d1, last_line_data_d2} <= 0;{cur_line_data_d1 , cur_line_data_d2 } <= 0;{next_line_data_d1, next_line_data_d2} <= 0;end else beginvalid_d1 <= valid_i;last_line_data_d1 <= last_line_data;last_line_data_d2 <= last_line_data_d1;cur_line_data_d1  <= cur_line_data;cur_line_data_d2  <= cur_line_data_d1;next_line_data_d1 <= next_line_data;next_line_data_d2 <= next_line_data_d1;endend//模板窗口范圍內判斷,前景色是黑色,背景色是白色,腐蝕處理就是前景色黑色減少//簡單理解也就是,3*3窗口中所有像素值都是0時,才能將當前像素值為0輸出always@(posedge clk or posedge reset) beginif(reset) beginvalid_o <= 0;img_data_o <= 0;end else if(valid_d1) beginif({last_line_data_d2, last_line_data_d1, last_line_data,cur_line_data_d2 , cur_line_data_d1 , cur_line_data ,next_line_data_d2, next_line_data_d1, next_line_data} == {27{8'd0}}) beginimg_data_o <= cur_line_data_d1;end else beginimg_data_o <= {3{8'd255}};   endvalid_o <= 1'b1;end else beginvalid_o <= 0;img_data_o <= 0;endendendmodule

明顯可以看書漢字部分,經過腐蝕運算之后,白色字體變寬了(要是清晰顯示文字,應該腐蝕白色,效果可能更好一點)?


二、圖像膨脹

1.相關定義

?2.圖像膨脹與圖像腐蝕的聯系

?3.FPGA實現

`timescale 1ns / 1ps
//
// Description: 圖像膨脹 (前景色是黑色,背景色是白色  只要覆蓋區域有前景色則膨脹黑色)
//
module image_dilate(input  wire          clk             ,input  wire          reset           ,input  wire [10:0]   img_width       ,input  wire [9:0]    img_height      ,input  wire          valid_i         ,input  wire [23:0]   last_line_data  ,input  wire [23:0]   cur_line_data   ,input  wire [23:0]   next_line_data  , output reg           valid_o         ,output reg [23:0]    img_data_o      
);//常量聲明parameter N = 3; //窗口大小//結構系數模版為{1,1,1,1,1,1,1,1,1}//變量聲明reg valid_d1;reg [23:0] last_line_data_d1, last_line_data_d2;reg [23:0] cur_line_data_d1 , cur_line_data_d2 ;reg [23:0] next_line_data_d1, next_line_data_d2;//中心點位置,為cur_line_data_d1always@(posedge clk or posedge reset) beginif(reset) beginvalid_d1 <= 0;{last_line_data_d1, last_line_data_d2} <= 0;{cur_line_data_d1 , cur_line_data_d2 } <= 0;{next_line_data_d1, next_line_data_d2} <= 0;end else beginvalid_d1 <= valid_i;last_line_data_d1 <= last_line_data;last_line_data_d2 <= last_line_data_d1;cur_line_data_d1  <= cur_line_data;cur_line_data_d2  <= cur_line_data_d1;next_line_data_d1 <= next_line_data;next_line_data_d2 <= next_line_data;endend//模板窗口范圍內判斷,前景色是黑色,背景色是白色,膨脹處理就是前景色黑色擴張//簡單理解也就是,3*3窗口中所有像素值都是255(白)時,才能將當前像素值為255輸出always@(posedge clk or posedge reset) beginif(reset) beginvalid_o <= 0;img_data_o <= 0;end else if(valid_d1) beginif({last_line_data_d2, last_line_data_d1, last_line_data,cur_line_data_d2 , cur_line_data_d1 , cur_line_data ,next_line_data_d2, next_line_data_d1, next_line_data} == {27{8'd255}}) beginimg_data_o <= cur_line_data_d1;end else beginimg_data_o <= 0;   endvalid_o <= 1'b1;end else beginvalid_o <= 0;img_data_o <= 0;endendendmodule

?三、圖像處理的開運算,閉運算和梯度運算

1.相關定義?

2.fpga實現?

開運算:

閉運算 :

梯度運算:

module image_process_top(input wire clk,input wire reset,input wire [10:0] img_width,input wire [9:0] img_height,input wire valid_i,input wire [23:0] img_data_i,output wire valid_o,output wire [23:0] img_data_o);//參數定義wire rgb2gray_valid;wire [23:0] rgb2gray_data;wire binary_valid;wire [23:0] binary_data;wire line_valid;wire [23:0] last_line_data, cur_line_data, next_line_data;wire erode_valid;wire [23:0] erode_data;wire dilate_valid;wire [23:0] dilate_data;wire line1_valid;wire [23:0] last_line1_data, cur_line1_data, next_line1_data;//灰度化處理image_rgb2gray u_image_rgb2gray(.clk        ( clk        ),.reset      ( reset      ),.valid_i    ( valid_i    ),.img_data_i ( img_data_i ),.valid_o    ( rgb2gray_valid    ),.img_data_o  ( rgb2gray_data  ));//二值化處理image_binary u_image_binary(.clk        ( clk        ),.reset      ( reset      ),.valid_i    ( rgb2gray_valid    ),.img_data_i ( rgb2gray_data ),.valid_o    ( binary_valid    ),.img_data_o  ( binary_data  ));//開運算
/*//3行緩存image_line_buffer u_image_line_buffer(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( binary_valid ),.img_data_i     ( binary_data ),.valid_o        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data  ( next_line_data  ));//圖像腐蝕image_erode u_image_erode(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( erode_valid    ),.img_data_o     ( erode_data     ));//3行緩存image_line_buffer u_image_line_buffer1(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( erode_valid ),.img_data_i     ( erode_data ),.valid_o        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data  ( next_line1_data  ));//圖像膨脹image_dilate u_image_dilate(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data ( next_line1_data ),.valid_o        ( valid_o        ),.img_data_o     ( img_data_o     ));
*///閉運算
/*//3行緩存image_line_buffer u_image_line_buffer(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( binary_valid ),.img_data_i     ( binary_data ),.valid_o        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data  ( next_line_data  ));//圖像膨脹image_dilate u_image_dilate(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( dilate_valid    ),.img_data_o     ( dilate_data     ));//3行緩存image_line_buffer u_image_line_buffer1(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( dilate_valid ),.img_data_i     ( dilate_data ),.valid_o        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data  ( next_line1_data  ));//圖像腐蝕image_erode u_image_erode(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data ( next_line1_data ),.valid_o        ( valid_o        ),.img_data_o     ( img_data_o     ));
*///梯度運算//3行緩存image_line_buffer u_image_line_buffer(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( binary_valid ),.img_data_i     ( binary_data ),.valid_o        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data  ( next_line_data  ));//圖像膨脹image_dilate u_image_dilate(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( dilate_valid    ),.img_data_o     ( dilate_data     ));//圖像腐蝕image_erode u_image_erode(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( erode_valid    ),.img_data_o     ( erode_data     ));assign valid_o = dilate_valid;assign img_data_o = (dilate_data == 0)&&(erode_data == {3{8'd255}}) ? 0 : {3{8'd255}};endmodule

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83535.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83535.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83535.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中國版Cursor:CodeBuddy騰訊云代碼助手使用體驗

我正在參加CodeBuddy「首席試玩官」內容創作大賽&#xff0c;本文所使用的 CodeBuddy 免費下載鏈接&#xff1a;騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴” 1.CodeBuddy簡介 騰訊云代碼助手CodeBuddy&#xff0c;這個是一款編程插件&#xff0c;我們可以在各個編程…

Go語言 GORM框架 使用指南

在 Go 語言社區中&#xff0c;數據庫交互一直是開發者們關注的重點領域&#xff0c;不同開發者基于自身的需求和偏好&#xff0c;形成了兩種主要的技術選型流派。一部分開發者鐘情于像sqlx這類簡潔的庫&#xff0c;盡管其功能并非一應俱全&#xff0c;但它賦予開發者對 SQL 語句…

從零開始學習three.js(18):一文詳解three.js中的著色器Shader

在WebGL和Three.js的3D圖形渲染中&#xff0c;著色器&#xff08;Shader&#xff09; 是實現復雜視覺效果的核心工具。通過編寫自定義的著色器代碼&#xff0c;開發者可以直接操作GPU&#xff0c;實現從基礎顏色渲染到動態光照、粒子效果等高級圖形技術。本文將深入解析Three.j…

Python函數庫調用實戰:以數據分析為例

一、引言 Python之所以在編程領域廣受歡迎&#xff0c;很大程度上得益于其豐富且強大的函數庫。這些函數庫涵蓋了從數據分析、科學計算到Web開發、機器學習等眾多領域&#xff0c;極大地提高了開發效率。本文將以數據分析為例&#xff0c;介紹如何調用Python的一些常用函數庫。…

shell腳本之條件判斷,循環控制,exit詳解

if條件語句的語法及案例 一、基本語法結構 1. 單條件判斷 if [ 條件 ]; then命令1命令2... fi2. 雙分支&#xff08;if-else&#xff09; if [ 條件 ]; then條件為真時執行的命令 else條件為假時執行的命令 fi3. 多分支&#xff08;if-elif-else&#xff09; if [ 條件1 ]…

現代 Web 自動化測試框架對比:Playwright 與 Selenium 的深度剖析

現代 Web 自動化測試框架對比&#xff1a;Playwright 與 Selenium 的深度剖析 摘要&#xff1a;本文對 Playwright 與 Selenium 在開發適配性、使用難度、場景適用性及性能表現等方面進行了全面深入的對比分析。通過詳細的技術實現細節闡述與實測數據支撐&#xff0c;為開發者…

系統架構設計(十):結構化編程

定義 結構化編程是一種遵循清晰邏輯結構、避免使用 goto 的編程方法。它強調使用有限的三種基本控制結構來組織程序&#xff0c;提高程序的可讀性、可維護性和可測試性。 它是現代程序設計的基礎&#xff0c;被廣泛應用于命令式語言&#xff08;如 C、Pascal、Java&#xff0…

TC3xx學習筆記-UCB BMHD使用詳解(二)

文章目錄 前言Confirmation的定義Dual UCB: Confirmation StatesDual UCB: Errored State or ECC Error in the UCB Confirmation CodesECC Error in the UCB ContentDual Password UCB ORIG and COPY Re-programming UCB_BMHDx_ORIG and UCB_BMHDx_COPY (x 0-3)BMHD Protecti…

OTA與boot loader

OTA指的是無線升級&#xff0c;通常用于更新設備的固件或軟件&#xff0c;用戶不用手動操作&#xff0c;非常方便。而bootloader是啟動時加載操作系統的程序&#xff0c;負責硬件初始化和啟動流程。 首先&#xff0c;OTA是如何通過bootloader工作的。OTA下載更新包后&#xff0…

實驗六:FPGA序列檢測器實驗

FPGA序列檢測器實驗(遠程實驗系統) 文章目錄 FPGA序列檢測器實驗(遠程實驗系統)一、數字電路基礎知識1. 時鐘與同步2. 按鍵消抖原理代碼講解:分頻與消抖3. 有限狀態機(FSM)設計代碼講解:狀態機編碼與轉移4. 邊沿檢測與信號同步5. 模塊化設計二、實驗數字電路整體思想三…

jenkins部署

開發者將代碼push到git運維人員通過jenkins部署&#xff0c;自動到git上pull代碼通過maven構建成jar包&#xff0c;并結合dockerfile打包成鏡像&#xff0c;push docker鏡像到docker registry通過k8s發起 發布/更新 服務 操作 通過Jenkins部署&#xff0c;自動到Git上PULL代碼 …

BBR 的 buffer 動力學觀感

這周很忙&#xff0c;今天還加了一天班&#xff0c;但還是抽空實現了五一在安徽涇縣山區喝著一壺酒寫的 BBR ProbeRTT 的想法&#xff0c;沒多少行代碼&#xff0c;它真就消除了帶寬鋸齒&#xff0c;皮了個鞋&#x1f45e;&#xff0c;昨天我還在群里說了今天再說說 BBR 的&…

第9講、深入理解Scaled Dot-Product Attention

Scaled Dot-Product Attention是Transformer架構的核心組件&#xff0c;也是現代深度學習中最重要的注意力機制之一。本文將從原理、實現和應用三個方面深入剖析這一機制。 1. 基本原理 Scaled Dot-Product Attention的本質是一種加權求和機制&#xff0c;通過計算查詢(Query…

el-tree結合checkbox實現數據回顯

組件代碼 <el-tree:data"vertiList"show-checkboxnode-key"id":props"defaultProps"ref"treeRefx"class"custom-tree"check-change"handleCheckChange"> </el-tree>獲取選擇的節點 handleCheckChan…

OpenResty 深度解析:構建高性能 Web 服務的終極方案

引言 openresty是什么&#xff1f;在我個人對它的理解來看相當于嵌入了lua的nginx; 我們在nginx中嵌入lua是為了不需要再重新編譯,我們只需要重新修改lua腳本,隨后重啟即可; 一.lua指令序列 我們分別從初始化階段&#xff0c;重寫/訪問階段&#xff0c;內容階段&#xff0c;日志…

多商戶商城系統源碼解析:開發直播電商APP的技術底層實戰詳解

隨著直播電商的火爆&#xff0c;越來越多的創業者和企業都在尋求打造自己的多商戶商城系統&#xff0c;以實現“人、貨、場”三者的深度融合。然而&#xff0c;從一個簡單的電商平臺到一個功能完善的直播電商APP&#xff0c;其技術底層架構和實現過程并非一蹴而就。本文將從架構…

桌面端進程通信

以下是關于 Electron 桌面端進程通信的基本知識點總結: 一、Electron 進程模型基礎 1. 進程類型與職責 進程類型職責權限主進程(Main)創建窗口、系統級操作、IPC中樞完全Node.js訪問權限渲染進程(Renderer)展示Web內容、UI交互默認受限(可配置開啟Node.js)預加載腳本(Prelo…

openEuler24.03 LTS下安裝MySQL8.0.42

目錄 前提步驟 刪除原有mysql及maridb數據庫 安裝MySQL 啟動MySQL 啟動查看MySQL狀態 設置MySQL開機自啟動 查看登錄密碼 登錄MySQL 修改密碼及支持遠程連接 遠程連接MySQL 前提步驟 擁有openEuler24.03 LTS環境&#xff0c;可參考&#xff1a;Vmware下安裝openEule…

idea 保證舊版本配置的同時,如何從低版本升到高版本

文章目錄 前言idea 保證舊版本配置的同時,如何從低版本升到高版本1. 備份項目2. 下載最新的idea3. 安裝安裝包4. 導入idea2019舊配置5. 驗證前言 如果您覺得有用的話,記得給博主點個贊,評論,收藏一鍵三連啊,寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差,…

填坑記: 古董項目Apache POI 依賴異常排除

當你看到NoSuchMethodError的時候&#xff0c;不要慌&#xff0c;深呼吸&#xff0c;這可能只是JAR包版本的問題… 引子&#xff1a;一個平靜的周二下午 那是一個看似平常的周二下午&#xff0c;系統運行良好&#xff0c;開發團隊在有條不紊地推進著新功能的開發。突然&#x…