图像分割与提取⑩

图像分割是图像处理过程中一种非常重要的操作。分水岭算法将图像形象的比喻为地理学上的地形表面,实现图像分割,该算法非常有效。

分水岭算法

二值化

在这里插入图片描述

import cv2
import numpy as np

img = cv2.imread("coins.jpg")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#----------二值化----------#
ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
#----------形态学操作----------#
#开操作
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN , kernel,iterations=2)
#膨胀
sure_bg = cv2.dilate(opening,kernel,iterations=3)#确认前景
#腐蚀
sure_fg = cv2.erode(opening,kernel,iterations=3)#确认背景
unknow = cv2.subtract(sure_bg,sure_fg)
#----------距离变化----------#
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
cv2.normalize(dist_transform,dist_transform,0,1.0,cv2.NORM_MINMAX)
#----------二值化----------#
ret,sure_fg = cv2.threshold(dist_transform,0.5*dist_transform.max(),255,0)
sure_fg = np.uint8(sure_fg)
unknow = cv2.subtract(sure_bg,sure_fg)
ret,makers = cv2.connectedComponents(sure_fg)
makers = makers+1
makers[unknow==255]=0
makers_copy = makers.copy()
makers_copy[makers==0]=150
makers_copy[makers==1]=0
makers_copy[makers>1]=255
makers_copy = np.uint8(makers_copy)


#应用分水岭算法
makers = cv2.watershed(img,makers)
img[makers==-1]=[0,0,255]
cv2.imshow("img",img)
cv2.imshow("binary",binary)
cv2.imshow("opening",opening)
cv2.imshow("sure_bg",sure_bg)
cv2.imshow("sure_fg",sure_fg)
cv2.imshow("unknow",unknow)
cv2.imshow("dist_transform",dist_transform)
cv2.imshow("makers_copy",makers_copy)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

import cv2
import numpy as np

def onMouse(event, x, y, flags,param):
    text = "I LOVE CHINA"
    text1 = "DYD is zhongguode"
    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.circle(img,(x,y),radius=5,color=(255,255,0),thickness=-1)
        cv2.putText(img, text, (x,y), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
    elif event == cv2.EVENT_RBUTTONDOWN:
        cv2.circle(img,(x,y),radius=5,color=(0,0,255),thickness=-1)
        cv2.putText(img, text1, (x,y), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
    
img = cv2.imread("yiqing.png")

cv2.namedWindow("img")
cv2.setMouseCallback("img", onMouse)
cv2.imshow("img",img)
while True:
    cv2.imshow("img",img)
    if cv2.waitKey(1)&0XFF ==ord("q"):
        break
cv2.destroyAllWindows()
import cv2
import numpy as np
class Point(object):
    def __init__(self,x,y):
        self.x = x
        self.y = y
 
    def getX(self):
        return self.x
    def getY(self):
        return self.y
def getGrayDiff(img,currentPoint,tmpPoint):
    return abs(int(img[currentPoint.x,currentPoint.y]) - int(img[tmpPoint.x,tmpPoint.y]))
def selectConnects(p):
    if p == 8:
        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)]#八邻域
    else:
        connects = [ Point(0, -1),  Point(1, 0),Point(0, 1), Point(-1, 0)]#四邻域
    return connects
def regionGrow(img,seeds,thresh):
    #读取图像的宽高,并建立一个和原图大小相同的seedMark
    height, width = img.shape
    seedMark = np.zeros(img.shape)
    #将定义的种子点放入种子点序列seedList
    seedList = []
    for seed in seeds:
        seedList.append(seed)
    label = 1
    #选择邻域
    #connects = selectConnects(p)
    p=4
    connects = selectConnects(p)
    #逐个点开始生长,生长的结束条件为种子序列为空,即没有生长点
    while(len(seedList)>0):
        #弹出种子点序列的第一个点作为生长点
        currentPoint = seedList.pop(0)#弹出第一个元素
        #并将生长点对应seedMark点赋值label(1),即为白色
        seedMark[currentPoint.x,currentPoint.y] = label
        #以种子点为中心,四邻域的像素进行比较
        for i in range(p):
            tmpX = currentPoint.x + connects[i].x
            tmpY = currentPoint.y + connects[i].y
            #判断是否为图像外的点,若是则跳过。  如果种子点是图像的边界点,邻域点就会落在图像外
            if tmpX < 0 or tmpY < 0 or tmpX >= height or tmpY >= width:
                continue
            #判断邻域点和种子点的差值
            grayDiff = getGrayDiff(img,currentPoint,Point(tmpX,tmpY))
            #如果邻域点和种子点的差值小于阈值并且是没有被分类的点,则认为是和种子点同类,赋值label,
            #并作为下一个种子点放入seedList
            if grayDiff < thresh and seedMark[tmpX,tmpY] == 0:
                seedMark[tmpX,tmpY] = label
                seedList.append(Point(tmpX,tmpY))
    return seedMark
#读入图像的灰度图像
img = cv2.imread('peppa.jpg',0)
# img = cv2.resize(img,(256,256))

#选定种子点
seeds = [Point(59,198)]
binaryImg = regionGrow(img,seeds,5)
cv2.imshow('segment',binaryImg)
cv2.imshow('gray', img)

cv2.waitKey(0)

cv2.destroyAllWindows()

© Fu Xianjun. All Rights Reserved.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值