用到:迭代阈值法,Otsu阈值,特征空间聚类法
实验用图:

1.用迭代阈值法确定阈值,对图像进行分割,显示阈值和分割结果;

import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
def diedai(img):img_array = np.array(img).astype(np.float32)#转化成数组I=img_arrayzmax=np.max(I)zmin=np.min(I)tk=(zmax+zmin)/2#设置初始阈值#根据阈值将图像进行分割为前景和背景,分别求出两者的平均灰度  zo和zbb=1m,n=I.shape;while b==0:ifg=0ibg=0fnum=0bnum=0for i in range(1,m):for j in range(1,n):tmp=I(i,j)if tmp>=tk:ifg=ifg+1fnum=fnum+int(tmp)  #前景像素的个数以及像素值的总和else:ibg=ibg+1bnum=bnum+int(tmp)#背景像素的个数以及像素值的总和#计算前景和背景的平均值zo=int(fnum/ifg)zb=int(bnum/ibg)if tk==int((zo+zb)/2):b=0else:tk=int((zo+zb)/2)return tk
img = cv2.imread("1.jpg")
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
img = cv2.resize(gray,(200,200))#大小
yvzhi=diedai(img)
ret1, th1 = cv2.threshold(img, yvzhi, 255, cv2.THRESH_BINARY)
print(ret1)
plt.imshow(th1,cmap=cm.gray)
plt.show()   

结果图:

2.用Otsu阈值,对图像分割,显示阈值和分割结果;

#coding:utf-8
import cv2
import numpy as np
from matplotlib import pyplot as pltimage = cv2.imread("1.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)plt.title("source image"), plt.xticks([]), plt.yticks([])plt.title("Histogram"), plt.xticks([]), plt.yticks([])
ret1, th1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)  #方法选择为THRESH_OTSU
plt.imshow(th1, "gray")
plt.title("OTSU,threshold is " + str(ret1)), plt.xticks([]), plt.yticks([])
plt.show()

结果图如下:

3.用特征空间聚类法,对彩色图像分割,显示分割结果。

# coding: utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取原始图像
img = cv2.imread('1.jpg')
print(img.shape)#图像二维像素转换为一维
data = img.reshape((-1,3))
data = np.float32(data)#定义中心 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)#设置标签
flags = cv2.KMEANS_RANDOM_CENTERS#聚集成2类
compactness, labels2, centers2 = cv2.kmeans(data, 2, None, criteria, 10, flags)#聚集成4类
compactness, labels4, centers4 = cv2.kmeans(data, 4, None, criteria, 10, flags)#聚集成8类
compactness, labels8, centers8 = cv2.kmeans(data, 8, None, criteria, 10, flags)#聚集成16类
compactness, labels16, centers16 = cv2.kmeans(data, 16, None, criteria, 10, flags)#聚集成64类
compactness, labels64, centers64 = cv2.kmeans(data, 64, None, criteria, 10, flags)#图像转换回uint8二维类型
centers2 = np.uint8(centers2)
res = centers2[labels2.flatten()]
dst2 = res.reshape((img.shape))centers4 = np.uint8(centers4)
res = centers4[labels4.flatten()]
dst4 = res.reshape((img.shape))centers8 = np.uint8(centers8)
res = centers8[labels8.flatten()]
dst8 = res.reshape((img.shape))centers16 = np.uint8(centers16)
res = centers16[labels16.flatten()]
dst16 = res.reshape((img.shape))centers64 = np.uint8(centers64)
res = centers64[labels64.flatten()]
dst64 = res.reshape((img.shape))#图像转换为RGB显示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst2 = cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB)
dst4 = cv2.cvtColor(dst4, cv2.COLOR_BGR2RGB)
dst8 = cv2.cvtColor(dst8, cv2.COLOR_BGR2RGB)
dst16 = cv2.cvtColor(dst16, cv2.COLOR_BGR2RGB)
dst64 = cv2.cvtColor(dst64, cv2.COLOR_BGR2RGB)#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']#显示图像
titles = [u'原始图像', u'聚类图像 K=2', u'聚类图像 K=4',u'聚类图像 K=8', u'聚类图像 K=16',  u'聚类图像 K=64']
images = [img, dst2, dst4, dst8, dst16, dst64]
for i in range(6):  plt.subplot(2,3,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i])  plt.xticks([]),plt.yticks([])
plt.show()

结果图如下:

这里注意,k值越大,所需要的计算量越大,所以要等待一段时间,如果你只要较小的几个k值的图片,那你能够很快的得到结果。

利用图像分割技术对给出的绿幕图像进行一系列处理,实现
1.前景目标和背景分离,即提取前景目标;
2.将提取出来的目标和其他背景(自备)合成为一幅新背景图像。

import cv2
import  numpy as npimg=cv2.imread('1.jpg')
img_back=cv2.imread('back.jpg')
#日常缩放
rows,cols,channels = img_back.shape
img_back=cv2.resize(img_back,None,fx=1.1,fy=1.1)
#cv2.imshow('img_back',img_back)rows,cols,channels = img.shape
img=cv2.resize(img,None,fx=0.4,fy=0.4)
#cv2.imshow('img',img)
rows,cols,channels = img.shape#rows,cols最后一定要是前景图片的,后面遍历图片需要用到#转换hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#获取mask
lower_blue=np.array([33,43,46])
upper_blue=np.array([77,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
#cv2.imshow('Mask', mask)#腐蚀膨胀
erode=cv2.erode(mask,None,iterations=1)
#cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
#cv2.imshow('dilate',dilate)#遍历替换
center=[50,50]#在新背景图片中的位置
for i in range(rows):for j in range(cols):if dilate[i,j]==0:#0代表黑色的点img_back[center[0]+i,center[1]+j]=img[i,j]#此处替换颜色,为BGR通道
cv2.imshow('res',img_back)cv2.waitKey(0)
cv2.destroyAllWindows()

结果图:

这里的效果不是很好,我这里是对绿色的背景进行筛选,还可以有以上的几种方法对图片的前景进行提取,也可以得到类似的效果。可能效果比这个好一点。
背景图如下:

这里要注意的是,你的背景图输出的时候不能比你的提取图片小,负责会出错,可以使用缩放进行调整。

迭代阈值法,otsu阈值法,特征空间类聚法对图像进行分割(python)相关推荐

  1. 【智能车】图像二值化算法--大津法OTSU

    图像二值化算法–大津法OTSU 大津算法是一种图像二值化算法,作用是确定将图像分成黑白两个部分的阈值. 大津法是针对灰度值进行阈值分割二值化,如果是彩色图像的话需要先转化成灰度图再进行计算. 方差越大 ...

  2. 图像分割 - 阈值处理 - 最大类间方差法(OTSU)

    目录 1. OTSU 介绍 2. 代码实现 1. OTSU 介绍 OTSU 大津法,也是最大类间方差算法 OTSU 算法的思想通过不同的阈值K,将图像的分为两个区域,一个是灰度值 0 <= k ...

  3. 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)

    目录 概念 C++源码 OtsuThreshold 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自C+ ...

  4. 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))

    目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...

  5. java大津法确定阈值,大津法(最大类间阈值法)

    大津法又叫最大类间方差法.最大类间阈值法(OTSU).它的基本思想是,用一个阈值将图像中的数据分为两类,一类中图像的像素点的灰度均小于这个阈值,另一类中的图像的像素点的灰度均大于或者等于该阈值.如果这 ...

  6. otsu阈值分割算法原理_大津法---OTSU算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  7. 【MATLAB教程案例23】基于MATLAB图像分割算法仿真——阈值分割法、Otsu阈值分割法、K均值聚类分割法等

    FPGA教程目录 MATLAB教程目录 目录 1.软件版本 2.通过二值图实现图像分割 3.通过Otsu阈值分割实现图像分割

  8. OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)

    OpenCV与图像处理学习七--传统图像分割之阈值法(固定阈值.自适应阈值.大津阈值) 一.固定阈值图像分割 1.1 直方图双峰法 1.2 OpenCV中的固定阈值分割 二.自动阈值图像分割 2.1 ...

  9. 图像二值化之最大类间方差法(大津法,OTSU)

    参考文章1:图像二值化与otsu算法介绍 参考文章2:python opencv cv2.threshold() (将固定级别的阈值应用于每个数组元素)ThresholdTypes 最大类间方差法(大 ...

最新文章

  1. mac下的抓包工具Charles
  2. javascript一些常用的代码
  3. 线程、多线程与线程池
  4. 3.0-vim编辑器和bash条件测试
  5. java变量命名规则_C++变量的命名规则
  6. 值类型、引用类型 再次理解
  7. lufylegend引擎制作接水果小游戏
  8. 编辑器漏洞、越权、逻辑漏洞(不安全的对象引用、功能级别访问控制缺失)
  9. 一文带你了解 Java 中的锁
  10. 聊一聊数学中的基本定理(二)——算术基本定理的价值
  11. Nacos6# Distro协议全量同步与校验
  12. 物联网技术主要有哪些,目前都应用在哪些领域?
  13. hidl 原理分析_【一点资讯】安卓手机NFC模拟门禁卡(设置UID)的一种方法 www.yidianzixun.com...
  14. RollPitchYaw傻傻分不清
  15. firefly-rk3288开发板Linux驱动——AT24C02 E2PROM驱动
  16. VMware Fusion 12.2.1 SLIC 2.6 MOD
  17. ShardingJDBC使用总结
  18. 无基础学Linux(4)——基本系统
  19. UE4(虚幻4)基础:光照需要重建
  20. 使用Python和OpenCV进行图像拼接和全景图构建

热门文章

  1. 关于近两个月程序设计的总结性报告
  2. zombie进程与orphan进程
  3. Collection 接口详解
  4. 每日一题---794. 有效的井字游戏[力扣][Go]
  5. 世界传感器大会:汉威科技新品震撼全场!
  6. 助力工业物联网,工业大数据之费用事实指标分析及实现【二十四】
  7. [DOM] Found 2 elements with non-unique id
  8. 2015061101 - 寻找女儿国
  9. 数独程序 Hodoku 的汉化
  10. Eclipse——基本使用