国产全肉乱妇杂乱视频丨中文字幕123丨精品久久99丨国产亚洲精品久久久久小丨亚洲香蕉成人av网站在线观看丨a最新天堂网资源丨超碰人人超碰人人丨青春草在线视频观看丨精品无码久久久久国产app丨欧美成人免费全部丨深夜福利国产丨国产三级全黄裸体丨日韩欧美人妻一区二区三区丨中日黄色片丨欧美伦理影院

 找回密碼
 立即注冊
查看: 2550|回復(fù): 5

PatchMatch圖像修復(fù)算法

[復(fù)制鏈接]

該用戶從未簽到

9

主題

37

回帖

95

積分

技術(shù)員

積分
95
樓主
發(fā)表于 2025-12-18 08:57:17 | 只看該作者 |倒序瀏覽 |閱讀模式
       PatchMatch圖像修復(fù)算法

PatchMatch算法出自Barnes的論文 PatchMatch: A Randomized Correspondence Algorithm for Structural Image Editing PatchMatch 算法就是一個找近似最近鄰(Approximate Nearest neigbhor)的方法,要比其他ANN算法快上10倍+。 將下面的圖理解了,就基本理解了整個算法。

看上圖時,我們以藍色為主顏色。A代表原圖像,矩形框代表待修復(fù)的patch塊,要修復(fù)patch_A塊就需要在B(也是原圖)中搜索一個最合適的塊patch_B,而從patch_A到patch_B的偏移量,就是上圖箭頭,也就是offset。 藍色為主patch塊,紅色是藍色向左移一個像素,綠色是藍色向上移一個像素。 上圖 (a):隨機初始化 (b):傳播 (c):隨機擾動搜索 PatchMatch 的核心思想是利用圖像的連續(xù)性(consistence), 一個圖像A的patch_A(藍色)附近的Patch塊(紅色綠色)的最近鄰(B中的紅色綠色框)可能出現(xiàn)在Patch_A的最近鄰(B中的藍色框)附近,利用這種圖像的連續(xù)性大量減少搜索的范圍,通過迭代的方式保證大多數(shù)點能盡快收斂。 PatchMatch算法是對所有待修復(fù)像素迭代修復(fù)的,而不是像Criminisi或FMM算法對待修復(fù)區(qū)域像素優(yōu)先級排序后進行漸進修復(fù)的。 算法步驟

首先是建立圖像的下采樣金字塔模型,代碼中設(shè)定為五層,建立模型后 對A的待修復(fù)區(qū)域每個patch塊隨機在B已知區(qū)域中匹配一個patch塊,即初始化偏置地圖(上圖a步驟)。 /********************************* 函數(shù)聲明:初始化偏置圖像 參數(shù):NONE 注釋:NONE 測試:NONE **********************************/ void PatchMatch::InitOff(Mat Mask, Mat &Off) {
  //為方便起見,將所有的都附上,要求不能賦值到非搜索區(qū)域 //初始化格式 Off = Mat(Mask.size(), CV_32FC2, Scalar::all(0));//2維無符號32位精度浮點數(shù) for (int i = 0; i {
  for (int j = 0; j {
  //不考慮search區(qū)域,沒有破損,他們的偏移向量當(dāng)然是0,自己 if (Mask.at(i, j) == search) {
  Off.at(i, j)[0] = 0; // 向量,2維,浮點數(shù) Off.at(i, j)[1] = 0; }
  else//處理hole,采用隨機偏置 {
  //先初始化2個偏置數(shù)r_col,r_row int r_col = rand() % Mask.cols; //rand()產(chǎn)生隨機數(shù),主要是產(chǎn)生一個偏置的初始值 int r_row = rand() % Mask.rows; r_col = r_col + j r_row = r_row + i //為什么要有這個循環(huán)?因為一次的隨機賦值,很可能會出現(xiàn)偏置后的塊跑到破損區(qū)域,或者是超出限定搜索框的邊界 while ( !(Mask.at(r_row + i, r_col + j) == search //這里加上I,j,是因為他是A投影到B中的搜索偏置 && abs(r_row) {
  r_col = rand() % Mask.cols; r_row = rand() % Mask.rows; //邊界檢測 r_col = r_col + j r_row = r_row + i }
  //賦偏置值 Off.at(i, j)[0] = r_row; Off.at(i, j)[1] = r_col; }
  }
  } }


之后從低分辨率開始,對于每一層金字塔模型進行迭代: 每一次迭代都會遍歷原圖A待修復(fù)區(qū)域所有像素。當(dāng)遍歷到當(dāng)前像素時,執(zhí)行下面的步驟來進行修復(fù): 步驟一:傳播(圖中b步驟) 傳播會計算原圖A當(dāng)前像素塊patch_A(藍色)對應(yīng)的B中的patch_B_1,patch_A上方(綠色)(奇數(shù)次迭代為下方)對應(yīng)的B中的patch_B_2,patch_A左側(cè)(紅色)(奇數(shù)次迭代為右側(cè))對應(yīng)的B中的patch_B_3這三個patch塊中與patch_A相似度的patch塊。 計算相似度函數(shù)為 //以塊為單位,用所有像素點的相同顏色通道的差平方來簡單判斷相似度 float PatchMatch::Distance(Mat Dst, Mat Src) {
  float distance = 0; for (int i = 0; i {
  for (int j = 0; j {
  for (int k = 0; k {
  int tem = Src.at (i, j)[k] - Dst.at (i, j)[k]; distance += tem * tem;//差平方 }
  }
  } return distance; }
傳播函數(shù): //迭代步:傳播 //(now_row, now_col):patch里的像素 //odd:當(dāng)前迭代次 void PatchMatch::Propagation(Mat Dst, Mat Src, Mat Mask, Mat &Off, int row, int col,int odd) {
  Mat DstPatch = GetPatch(Dst, row, col);//獲取長度為 patchsize = 3 的邊界框, (row, col)代表的是中心像素點坐標(biāo) if (odd % 2 == 0)//偶次迭代 {
  //提取(row, col)的match塊 Mat SrcPatch = GetPatch(Src, row + Off.at (row, col)[0], col + Off.at (row, col)[1]); //提取(row, col-1)的match塊 Mat LSrcPatch = GetPatch(Src, row + Off.at (row, col - 1)[0], col - 1 + Off.at (row, col - 1)[1]); //提取(row-1, col)的match塊 Mat USrcPatch = GetPatch(Src, row - 1 + Off.at (row - 1, col)[0], col + Off.at (row - 1, col)[1]); //返回上面4個塊最相似的塊的代表數(shù)字,用于switch判斷 int location = GetMinPatch1(DstPatch, SrcPatch, LSrcPatch, USrcPatch); //利用上面的信息更新像素點的偏置地圖 switch (location) {
  //若是1則不更新 case 2: Off.at (row, col)[0] = Off.at (row, col - 1)[0]; Off.at (row, col)[1] = Off.at (row, col - 1)[1] - 1; break; case 3: Off.at (row, col)[0] = Off.at (row - 1, col)[0] - 1; Off.at (row, col)[1] = Off.at (row - 1, col)[1]; break; }
  } else//奇數(shù)次迭代 {
  Mat SrcPatch = GetPatch(Src, row + Off.at (row, col)[0], col + Off.at (row, col)[1]); Mat RSrcPatch = GetPatch(Src, row + Off.at (row, col + 1)[0], col + 1 + Off.at (row, col + 1)[1]); Mat DSrcPatch = GetPatch(Src, row + 1 + Off.at (row + 1, col)[0], col + Off.at (row + 1, col)[1]); int location = GetMinPatch1(DstPatch, SrcPatch, RSrcPatch, DSrcPatch); switch (location) {
  case 2: Off.at (row, col)[0] = Off.at (row, col + 1)[0]; Off.at (row, col)[1] = Off.at >(row, col + 1)[1] + 1; break; case 3: Off.at (row, col)[0] = Off.at >(row + 1, col)[0] + 1; Off.at (row, col)[1] = Off.at (row + 1, col)[1]; break; }
  } }


步驟二:隨機擾動搜索(圖中c步驟) 為了避免陷入局部極值,再額外再隨機生成幾個patch位置作為候選patch塊,若小于當(dāng)前patch,則更新。 隨機擾動會在原圖A中,以當(dāng)前像素為中心點,初始半徑區(qū)域為全圖,在此區(qū)域內(nèi)隨機找尋patch塊并與patch_A原本對應(yīng)的B中的patch塊對比,若更相似則更新對應(yīng)關(guān)系offset,然后以新的patch_B為中心,半徑縮小一倍,繼續(xù)搜索,直到半徑縮小為1,更新完畢。 //迭代第二步:隨機搜索 //(row,col)=(now_row, now_col):修復(fù)patch里的像素 void PatchMatch::RandomSearch(Mat Dst, Mat Src, Mat Mask, Mat &Off, int row, int col) {
  Mat DstPatch = GetPatch(Dst, row, col);//獲取修復(fù)基準(zhǔn)框,在框內(nèi)操作 //迭代指數(shù) int attenuate = 0; while (true) {
  //獲取隨機參數(shù),在 [-1;1] 間 float divcol = rand() % 2000 / 1000.0f - 1.0f; float divrow = rand() % 2000 / 1000.0f - 1.0f; //減小框大小的公式,

回復(fù)

使用道具 舉報

該用戶從未簽到

8

主題

28

回帖

83

積分

技術(shù)員

積分
83
沙發(fā)
發(fā)表于 2025-12-20 21:05:27 | 只看該作者
謝謝分享,收獲不小
回復(fù)

使用道具 舉報

  • TA的每日心情

    2024-7-29 18:57
  • 簽到天數(shù): 1 天

    [LV.1]初來乍到

    1

    主題

    87

    回帖

    179

    積分

    技術(shù)員

    積分
    179
    板凳
    發(fā)表于 2025-12-23 04:10:55 | 只看該作者
    謝謝分享,非常有幫助
    回復(fù)

    使用道具 舉報

  • TA的每日心情
    奮斗
    2024-9-2 13:38
  • 簽到天數(shù): 2 天

    [LV.1]初來乍到

    5

    主題

    73

    回帖

    168

    積分

    技術(shù)員

    積分
    168
    地板
    發(fā)表于 2026-1-1 07:00:41 | 只看該作者
    感謝分享寶貴技術(shù)
    回復(fù)

    使用道具 舉報

    該用戶從未簽到

    7

    主題

    81

    回帖

    184

    積分

    技術(shù)員

    積分
    184
    5#
    發(fā)表于 2026-1-1 15:00:58 | 只看該作者
    感謝分享,收獲不小
    回復(fù)

    使用道具 舉報

  • TA的每日心情
    慵懶
    2024-9-3 13:55
  • 簽到天數(shù): 1 天

    [LV.1]初來乍到

    4

    主題

    73

    回帖

    166

    積分

    技術(shù)員

    積分
    166
    6#
    發(fā)表于 2026-1-4 07:06:10 | 只看該作者
    受教了,收獲很大
    回復(fù)

    使用道具 舉報

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則

    QQ|Archiver|小黑屋|制造論壇 ( 浙B2-20090312-57 )|網(wǎng)站地圖

    GMT+8, 2026-3-13 02:58 , Processed in 0.034679 second(s), 20 queries .

    Powered by Discuz! X3.5

    Copyright © 2001-2020, Tencent Cloud.

    快速回復(fù) 返回頂部 返回列表