图像分割中的cv2函数讲解

import cv2
import numpy as np
import matplotlib.pyplot as plt

img0 = cv2.imread("E:\code\du\yicun.jpg")#输入文件名
img1 = cv2.resize(img0, dsize=None, fx=0.5, fy=0.5)
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
h, w = img1.shape[:2]
print(h, w)

cv2.namedWindow("W0")
cv2.imshow("W0", img1)
cv2.waitKey(delay=0)

#图像二值化

#第一种阈值类型
ret0, img3 = cv2.threshold(img2, 127, 255, cv2.THRESH_BINARY)
print(ret0)
#第二种阈值类型
ret1, img4 = cv2.threshold(img2, 127, 255, cv2.THRESH_BINARY_INV)
print(ret1)
#第三种阈值类型
ret2, img5 = cv2.threshold(img2, 127, 255, cv2.THRESH_TRUNC)
print(ret2)
#第四种阈值类型
ret3, img6 = cv2.threshold(img2, 127, 255, cv2.THRESH_TOZERO)
print(ret3)
#第五种阈值类型
ret4, img7 = cv2.threshold(img2, 127, 255, cv2.THRESH_TOZERO)
print(ret4)

####将所有阈值类型得到的图像绘制到同一张图中
plt.rcParams['font.family'] = 'SimHei'  #将全局中文字改为黑体
figure = [img2, img3, img4, img5, img6, img7]
title = ["原图", "第一种阈值类型", "第二种阈值类型", "第三种阈值类型", "第四种阈值类型", "第五种阈值类型"]

for i in range(6):
    figure[i] = cv2.cvtColor(figure[i], cv2.COLOR_BGR2RGB)   #转化图像通道顺序,这一个步骤要记得
    plt.subplot(3, 2, i+1)
    plt.imshow(figure[i])
    plt.title(title[i])   #添加标题

plt.savefig("E:\code\du\yicun2.jpg")#输入保存地址
plt.show()

#边缘检测之Sobel算子
img8 = cv2.Sobel(img2, cv2.CV_64F, 0, 1, ksize=5)
cv2.namedWindow("W1")
cv2.imshow("W1",img8)
cv2.waitKey(delay=0)

#K-means均值聚类
Z = img1.reshape((-1, 3))
Z = np.float32(Z) #转化数据类型
c = (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
k = 4
ret, label, center = cv2.kmeans(Z, k, None, c, 10, cv2.KMEANS_RANDOM_CENTERS)
center = np.uint8(center)
res = center[label.flatten()]
img9 = res.reshape((img1.shape))
cv2.namedWindow("W2")
cv2.imshow("W2", img9)
cv2.waitKey(delay = 0)

#分水岭算法
ret1, img10 = cv2.threshold(img2, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)#(图像阈值分割,将背景设为黑色))
cv2.namedWindow("W3")
cv2.imshow("W3", img10)
cv2.waitKey(delay=0)

##noise removal(去除噪声,使用图像形态学的开操作,先腐蚀后膨胀)
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(img10, cv2.MORPH_OPEN, kernel, iterations=2)
#sure background area(确保背景图像,使用膨胀操作)
sure_bg = cv2.dilate(opening, kernel, iterations=3)
#Finding sure foreground area(确保前景图像,也就是目标)
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
ret2, sure_fg = cv2.threshold(dist_transform, 0.7*dist_transform.max(), 255, 0)
#Finding unknown region(找到未知的区域)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)
#Marker labelling
ret3, markers = cv2.connectedComponents(sure_fg) #用0标记所有背景像素点
#Add one to all label so that sure background is not 0, but1(将背景设为1)
markers = markers+1
#Now, mark the region of unknown with zero(将未知区域设为0)
markers[unknown == 255] = 0
markers = cv2.watershed(img1, markers) #进行分水岭操作
img1[markers == -1] = [0, 0, 255] #边界区域设为-1,颜色设置为红色
cv2.namedWindow("W4")
cv2.imshow("W4", img1)
cv2.waitKey(delay=0)

cv2.imread()

retval = cv2.imread(filename, flags)

cv2.imread()用于从指定的文件读取图像。

flags = 0从文件中读取黑白图像

flags = 1从文件中读取彩色图像

举例

img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)
img2 = cv2.imread(imgFile, flags=0)  # flags=0 读取为灰度图像

cv2.imwrite()

retval = cv2.imwrite(filename, img)

函数 cv2.imwrite() 用于将图像保存到指定的文件。

filename:要保存的文件的路径和名称,包括文件扩展名

img:要保存的 OpenCV 图像,nparray 多维数组

举例

saveFile = "../images/imgSave.png"  # 保存文件的路径
cv2.imwrite(saveFile, img3)  # 保存图像文件

cv2.imshow()

None = imshow(winname, img)

winname:字符串,显示窗口的名称。

img:所显示的 OpenCV 图像,nparray 多维数组。

cv2.imshow("Demo1", img1)  # 在窗口 "Demo1" 显示图像 img1
cv2.imshow("Demo2", img2)  # 在窗口 "Demo2" 显示图像 img2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值