日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV与图像处理学习十——区域生长算法(含代码)

發布時間:2024/7/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV与图像处理学习十——区域生长算法(含代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OpenCV與圖像處理學習十——區域生長算法(含代碼)

  • 一、區域生長算法概要
  • 二、區域生長算法原理
  • 三、代碼應用

一、區域生長算法概要

區域生長是一種串行區域分割的圖像分割方法。區域生長是指從某個像素出發,按照一定的準則,逐步加入鄰近像素,當滿足一定的條件時,區域生長終止

區域生長的好壞決定于:

  • 初始點(種子點)的選取。
  • 生長準則。
  • 終止條件。
  • 區域生長是從某個或者某些像素點出發,最后得到整個區域,進而實現目標的提取

    二、區域生長算法原理

    基本思想:將具有相似性質的像素集合起來構成區域。

    步驟:

  • 對圖像順序掃描,找到第1個還沒有歸屬的像素, 設該像素為(x0, y0);
  • 以(x0, y0)為中心, 考慮(x0, y0)的4鄰域像素(x, y)如果(x0,y0)滿足生長準則, 將(x, y)與(x0, y0)合并(在同一區域內), 同時將(x, y)壓入堆棧(即滿足條件,被判定為和(x0, y0)屬于一個區域,后面需要再從這些點往外繼續生長,所以需要保存);
  • 從堆棧中取出一個像素, 把它當作(x0, y0)返回到步驟2(繼續往外生長);
  • 當堆棧為空時,返回到步驟1(有像素可能不屬于前面的區域);
  • 重復步驟1 - 4直到圖像中的每個點都有歸屬時;生長結束。
  • 三、代碼應用

    這里為簡單起見,我們只設置了一個區域,即上述步驟中的第四步改為,當堆棧為空時,生長結束。

    我們需要分割的圖像如下所示:

    我們將生長準則設置為像素值之間的歐式距離小于某個閾值,也就是說相鄰像素值的差異較小時,歸類為一個區域,代碼如下所示:

    # -*- coding:utf-8 -*- import cv2 import numpy as np ########################################################################################################################################################################### class Point(object):def __init__(self, x, y):self.x = xself.y = ydef getX(self):return self.xdef getY(self):return self.y connects = [Point(-1, -1), Point(0, -1), Point(1, -1), Point(1, 0),Point(1, 1), Point(0, 1), Point(-1, 1), Point(-1, 0)] ##################################################################################### # 計算兩個點間的歐式距離 def get_dist(seed_location1, seed_location2):l1 = im[seed_location1.x, seed_location1.y]l2 = im[seed_location2.x, seed_location2.y]count = np.sqrt(np.sum(np.square(l1-l2)))return count# import Image im = cv2.imread('./image/222.jpg') cv2.imshow('src', im) cv2.waitKey(0) cv2.destroyAllWindows() im_shape = im.shape height = im_shape[0] width = im_shape[1]print('the shape of image :', im_shape)# 標記,判斷種子是否已經生長 img_mark = np.zeros([height, width]) cv2.imshow('img_mark', img_mark) cv2.waitKey(0) cv2.destroyAllWindows()# 建立空的圖像數組,作為一類 img_re = im.copy() for i in range(height):for j in range(width):img_re[i, j][0] = 0img_re[i, j][1] = 0img_re[i, j][2] = 0 cv2.imshow('img_re', img_re) cv2.waitKey(0) cv2.destroyAllWindows() # 取一點作為種子點 seed_list = [] seed_list.append(Point(15, 15)) T = 7 # 閾值 class_k = 1 # 類別 # 生長一個類 while (len(seed_list) > 0):seed_tmp = seed_list[0]# 將以生長的點從一個類的種子點列表中刪除seed_list.pop(0)img_mark[seed_tmp.x, seed_tmp.y] = class_k# 遍歷8鄰域for i in range(8):tmpX = seed_tmp.x + connects[i].xtmpY = seed_tmp.y + connects[i].yif (tmpX < 0 or tmpY < 0 or tmpX >= height or tmpY >= width):continuedist = get_dist(seed_tmp, Point(tmpX, tmpY))# 在種子集合中滿足條件的點進行生長if (dist < T and img_mark[tmpX, tmpY] == 0):img_re[tmpX, tmpY][0] = im[tmpX, tmpY][0]img_re[tmpX, tmpY][1] = im[tmpX, tmpY][1]img_re[tmpX, tmpY][2] = im[tmpX, tmpY][2]img_mark[tmpX, tmpY] = class_kseed_list.append(Point(tmpX, tmpY))######################################################################################## # 輸出圖像 cv2.imshow('OUTIMAGE', img_re) cv2.waitKey(0) cv2.destroyAllWindows()

    分割得到的結果如下所示:

    很顯然,天空的像素值較為接近,所以被生長為一片區域,而房屋的像素與天空的差異較大,當天空的區域生長結束之后,因為這里只設置了分割一塊區域,所以下面的房屋部分沒有遍歷到。

    總結

    以上是生活随笔為你收集整理的OpenCV与图像处理学习十——区域生长算法(含代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。