python+opencv3图像处理学习记录

2024-04-19 07:48

本文主要是介绍python+opencv3图像处理学习记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概括

本文主要用于记录图像处理学习过程中的笔记与疑问,使用pycharm IDE python语言和opencv工具。

第一章 简单的图像处理方式

1.图片、视频资源读取


图片读取
import cv2 as cv
import numpy as np
src = cv.imread("C:/Users/H/Desktop/13d98c6f3117f0a19b9d40c44ac7a30f.jpg")
cv.imshow("src",src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果:
在这里插入图片描述

视频读取:

import cv2 as cv
import numpy as np
def video_demo():capture = cv.VideoCapture(0)# 0代表开启摄像头获取视频,可使用视频路径代替while True:ret, frame = capture.read()if cv.waitKey(100) == 27:breakcv.imshow("frame", frame)
video_demo()
cv.waitKey(0)
cv.destroyAllWindows()

视频读取的处理需要截取每一帧图片对图片进行处理后组合展示,呈现视频效果。

2.色彩空间的转换、对比度、亮度调整

HSV图像空间 HSV色彩空间(Hue-色调、Saturation-饱和度、Value-值)将亮度从色彩中分解出来,在图像增强算法中用途很广,在很多图像处理任务中,经常将图像从RGB色彩空间转换到了HSV色彩空间,以便更好地感知图像颜色,利用HSV分量从图像中提取感兴趣的区域。

YUV YCrCb该颜色空间主要是基于人眼对亮度比对色度敏感这一特性而来的,将颜色分量和亮度分量分离开来。
HSV图像空间表 在这里插入图片描述

# HSV图像色彩空间转换
def color_space_demo(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("gray", gray)hsv = cv.cvtColor(image, cv.COLOR_RGB2HSV)cv.imshow("hsv", hsv)yuv = cv.cvtColor(image, cv.COLOR_RGB2YUV)cv.imshow("yuv", yuv)Ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)cv.imshow("Ycrcb", Ycrcb)# 调整图像的亮度与对比度,本函数中c代表对比度,b代表亮度
def contrast_brightness_demo(image, c, b):h, w, ch = image.shapeblank = np.zeros([h, w, ch], image.dtype)dst = cv.addWeighted(image, c, blank, 1 - c, b)cv.imshow("con-bri-demo", dst)

3.像素运算

图像的像素运算:加减乘除、均值 、方差。

import cv2 as cv
import numpy as np# 像素相加
def add_demo(m1, m2):dst = cv.add(m1, m2)cv.imshow("add_demo", dst)  # 显示图片# 像素相减
def subtract_demo(m1, m2):dst = cv.subtract(m1, m2)cv.imshow("subtract_demo", dst)# 像素相除
def divide_demo(m1, m2):dst = cv.divide(m1, m2)cv.imshow("divide_demo", dst)# 像素相乘
def multiply_demo(m1, m2):dst = cv.multiply(m1, m2)cv.imshow("multiply_demo", dst)# 其他操作
def others(m1, m2):M1, dev1 = cv.meanStdDev(m1) # M1均值,dev1方差M2, dev2 = cv.meanStdDev(m2) # M2均值,dev2方差h, w = m1.shape[:2]print(M1)                    # 打印均值M1print(M2)                    # 打印均值M2print(dev1)                  # 打印方差print(dev2)                  # 打印方差img = np.zeros([h, w], np.uint8)    # 产生一个所有像素都为0的图片m, dev = cv.meanStdDev(img)   # 获取该图片的均值和方差print(m)                      # 打印均值:[[0.]]print(dev)                    # 打印方差:[[0.]]
# 说明:可通过均值和方差判断图片中是否有有用信息src1 = cv.imread("C:/Users/H/Desktop/92e8823ecc933f05edbfe5f9186e42c2.jpg")
src2 = cv.imread("C:/Users/H/Desktop/13d98c6f3117f0a19b9d40c44ac7a30f.jpg")
print(src1.shape)
print(src2.shape)
cv.namedWindow("input image1", cv.WINDOW_AUTOSIZE)  # 设置图片尺寸,自动
cv.imshow("input image1", src1)  # 显示图像
cv.namedWindow("input image2", cv.WINDOW_AUTOSIZE)  # 设置图片尺寸,自动
cv.imshow("input image2", src2)  # 显示图像
add_demo(src1, src2)
subtract_demo(src1, src2)
divide_demo(src1, src2)
multiply_demo(src1, src2)
others(src1, src2)
cv.waitKey(0)
cv.destroyAllWindows()

4.泛洪填充 ROI

ROI 是指对图像提取出有用的部分,利用mask(掩模)技术提取纯色背景图像ROI区域中的人和物,并将提取出来的人或物添加在其他图像上。
如下将利用该方式实现对某些色彩的提取并得到想要的部分

import cv2 as cv
import numpy as np
def getRoi(image):hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)  # 转换成hsv色彩风格cv.imshow('hsv', hsv)mask = cv.inRange(hsv, (26, 43, 46), (155, 255, 255))  # 利用inRange产生maskmask = cv.bitwise_not(mask) #取反dst = cv.bitwise_and(image, image, mask=mask)print(dst.shape)cv.imshow('mask1', mask)cv.imshow('dst', dst)src = cv.imread("C:/Users/H/Desktop/13d98c6f3117f0a19b9d40c44ac7a30f.jpg")
cv.imshow('src', src)
getRoi(src)cv.waitKey(0)
cv.destroyAllWindows()

运行结果:
在这里插入图片描述

5.模糊操作

模糊分为均值模糊,中值模糊,高斯模糊,双边模糊,
如下是中值模糊,均值模糊和锐化操作的代码实现:

def custom_blur_demo(image):""" # 均值模糊 去噪 随机噪声# 在y方向模糊15个像素dst=cv.blur(image,(1,15))# 在x方向模糊15个像素dst = cv.blur(image, (15, 1))# 中值模糊 去噪 椒盐噪声dst= cv.medianBlur(image,5)""" #kernel=np.ones([5,5],np.float32)/25#锐化操作 一般算子和为0或者1 0主要用于提取边缘 1实现图像锐化kernel = np.array([[0, -5, 0], [-5, 20, -5], [0, -5, 0]], np.float32)dst=cv.filter2D(image,-1,kernel=kernel)cv.imshow("dst",dst)

高斯模糊:当图像出现高斯噪声时,很不方便去提取出轮廓以及层次,如下所示:

import cv2 as cv
import numpy as np
def clamp(s):if s>255:return 255if s< 0:return 0else:return s
def kernel_get(image):kernel = np.array([[0, -5, 0], [-5, 20, -5], [0, -5, 0]], np.float32)dst = cv.filter2D(image, -1, kernel=kernel)return dst
def gaussian_noise(image):h,w,c=image.shapefor row in range(h):for col in range(w):s=np.random.normal(0,20,3)b=image[row,col,0]g=image[row,col,1]r=image[row,col,2]image[row,col,0] = clamp(b+s[0])image[row, col, 1] = clamp(g + s[1])image[row, col, 2] = clamp(r + s[2])cv.imshow("noise add",image)
src = cv.imread("C:/Users/H/Desktop/13d98c6f3117f0a19b9d40c44ac7a30f.jpg")
cv.imshow("src",src)
cv.imshow("dst1",kernel_get(src))
gaussian_noise(src)
cv.imshow("dst2",kernel_get(src))
cv.waitKey(0)
cv.destroyAllWindows()

结果展示:
在这里插入图片描述
可以看出添加高斯噪声之后,图像提取边缘变得及其困难
然后分别对原图和添加噪声的图进行高斯模糊过滤:

import cv2 as cv
import numpy as np
def clamp(s):if s>255:return 255if s< 0:return 0else:return s
def kernel_get(image):kernel = np.array([[0, -5, 0], [-5, 21, -5], [0, -5, 0]], np.float32)dst = cv.filter2D(image, -1, kernel=kernel)return dst
def gaussian_noise(image):h,w,c=image.shapefor row in range(h):for col in range(w):s=np.random.normal(0,20,3)b=image[row,col,0]g=image[row,col,1]r=image[row,col,2]image[row,col,0] = clamp(b+s[0])image[row, col, 1] = clamp(g + s[1])image[row, col, 2] = clamp(r + s[2])cv.imshow("noise add",image)
src = cv.imread("C:/Users/H/Desktop/13d98c6f3117f0a19b9d40c44ac7a30f.jpg")
cv.imshow("src",src)
dst=cv.GaussianBlur(src,(5,5),0)
cv.imshow("dst1",dst)
gaussian_noise(src)
dst=cv.GaussianBlur(src,(5,5),0)
cv.imshow("dst2",dst)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
可以看出相对比之下,噪声对于高斯模糊的影响不是很大,可以较好地去除。
边缘模糊(边缘保留滤波)EPF 该方式会在像素差别较大的区域中不进行模糊操作,从而实现在整体轮廓不变的前提下进行模糊操作,常用于去除斑点,美白图像中。
在opencv中提供了两个API ,一个类似于高斯模糊的磨皮效果,保留原有边缘,另一个则会对像素周围权值进行升高或者降低,从而将边缘明显化。

def bi_demo(image):dst=cv.bilateralFilter(image,0,100,15)return dst
def shift_demo(image):dst=cv.pyrMeanShiftFiltering(image,10,50)return dst

在这里插入图片描述如图所示可以清晰看到物体轮廓并没有发生改变。
在这里插入图片描述
如图所示可以看出在前者基础上提高了边缘的展现。

6. 直方图

直方图均衡化,常用于对比度的调整。

#局部直方图均衡化 灰度
def clahe_demo(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)clahe = cv.createCLAHE(clipLimit=5.0, tileGridSize=(8, 8))dst = clahe.apply(gray)dst1=cv.cvtColor(dst,cv.COLOR_GRAY2BGR)cv.imshow("clahe", dst1)
#彩色空间三通道
def clahe2(iamge):b, g, r = cv.split(iamge)clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(10, 10))dst_b = clahe.apply(b)dst_g = clahe.apply(g)dst_r = clahe.apply(r)merged = cv.merge([dst_b,dst_g,dst_r])cv.imshow("clahe", merged)
src = cv.imread("C:/Users/H/Desktop/13d98c6f3117f0a19b9d40c44ac7a30f.jpg")
cv.imshow("src",src)
clahe2(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果在这里插入图片描述

在这里插入图片描述
直方图比较:
巴士距离越小,图像越相关,相关性越大。卡方越小

# 直方图比较
def create_rgb_hist(image):h, w, c = image.shapergbHist = np.zeros([16*16*16, 1], np.float32)bsize = 256/16for row in range(h):for col in range(w):b = image[row, col, 0]g = image[row, col, 1]r = image[row, col, 2]index = np.int((b/bsize)/16*16 + np.int(g/bsize)*16 + np.int(r/bsize))rgbHist[np.int(index), 0] = rgbHist[np.int(index), 0] + 1return rgbHistdef hist_compare(image1, image2):hist1 = create_rgb_hist(image1)hist2 = create_rgb_hist(image2)match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)print("巴氏距离: %s, 相关性: %s, 卡方: %s"%(match1, match2, match3))cv.imshow("image1", image1)cv.imshow("image2", image2)

7.模板匹配

这部分据说用得不多,没有做实验,把网上扒的代码先放着存一下。

#opencv模板匹配----单目标匹配
import cv2
#读取目标图片
target = cv2.imread("target.jpg")
#读取模板图片
template = cv2.imread("template.jpg")
#获得模板图片的高宽尺寸
theight, twidth = template.shape[:2]
#执行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED
result = cv2.matchTemplate(target,template,cv2.TM_SQDIFF_NORMED)
#归一化处理
cv2.normalize( result, result, 0, 1, cv2.NORM_MINMAX, -1 )
#寻找矩阵(一维数组当做向量,用Mat定义)中的最大值和最小值的匹配结果及其位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
#匹配值转换为字符串
#对于cv2.TM_SQDIFF及cv2.TM_SQDIFF_NORMED方法min_val越趋近与0匹配度越好,匹配位置取min_loc
#对于其他方法max_val越趋近于1匹配度越好,匹配位置取max_loc
strmin_val = str(min_val)
#绘制矩形边框,将匹配区域标注出来
#min_loc:矩形定点
#(min_loc[0]+twidth,min_loc[1]+theight):矩形的宽高
#(0,0,225):矩形的边框颜色;2:矩形边框宽度
cv2.rectangle(target,min_loc,(min_loc[0]+twidth,min_loc[1]+theight),(0,0,225),2)
#显示结果,并将匹配值显示在标题栏上
cv2.imshow("MatchResult----MatchingValue="+strmin_val,target)
cv2.waitKey()
cv2.destroyAllWindows()

8.边缘提取检测

Canny方式:
Canny边缘检测器是一种被广泛使用的算法,并被认为是边缘检测最优的算法,该方法使用了比高斯差分算法更复杂的技巧,如多向灰度梯度和滞后阈值化

import os
import cv2
img = cv2.imread('1.jpg', 0)#转化为灰度图
img_color = img
blur = cv2.GaussianBlur(img, (3, 3), 0)  # 用高斯滤波处理原图像降噪
canny = cv2.Canny(blur, 50, 150)  # 50是最小阈值,150是最大阈值
cv2.namedWindow("canny",0);#可调大小
cv2.namedWindow("1",0);#可调大小
cv2.imshow('1', img)
cv2.imshow('canny', canny)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:
在这里插入图片描述

Sobel方式:
Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪声能力很强,用途较多。尤其是效率要求较高的彩色图像。

# Sobel边缘检测算子
import os
import cv2
img = cv2.imread('1.jpg', 0)#转化为灰度图
x = cv2.Sobel(img, cv2.CV_16S, 1, 0)
y = cv2.Sobel(img, cv2.CV_16S, 0, 1)
# cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
# 可选参数alpha是伸缩系数,beta是加到结果上的一个值,结果返回uint类型的图像
Scale_absX = cv2.convertScaleAbs(x)  # convert 转换  scale 缩放
Scale_absY = cv2.convertScaleAbs(y)
result = cv2.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
cv2.namedWindow("result",0);#可调大小
cv2.namedWindow("1",0);#可调大小
cv2.imshow('1', img)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:
在这里插入图片描述

9.直线检测

import cv2
import numpy as npimg = cv2.imread("C:/Users/H/Desktop/000035.jpg")
height = img.shape[0]  # 高度
width = img.shape[1]  # 宽度
cut_img = imggray = cv2.cvtColor(cut_img, cv2.COLOR_BGR2GRAY)
cv2.waitKey(0)
edges = cv2.Canny(gray, 50, 150, apertureSize=5)lines = cv2.HoughLines(edges, 1, np.pi / 180, 100)
result = cut_img.copy()
minLineLength = 5  # height/32
maxLineGap = 3  # height/40
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 80, minLineLength, maxLineGap)for x1, y1, x2, y2 in lines[0]:cv2.line(result, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:
在这里插入图片描述

10.圆检测

#霍夫圆检测
import cv2 as cv
import numpy as npdef detect_circles_demo(image):dst = cv.pyrMeanShiftFiltering(image, 8, 80)   #边缘保留滤波EPFcimage = cv.cvtColor(dst, cv.COLOR_RGB2GRAY)cv.imshow("cimage", cimage)circles = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)circles = np.uint16(np.around(circles)) #把circles包含的圆心和半径的值变成整数for i in circles[0, : ]:cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)  #画圆cv.circle(image, (i[0], i[1]), 2, (0, 0, 255), 2)  #画圆心cv.imshow("circles", image)src = cv.imread('C:/Users/H/Desktop/92e8823ecc933f05edbfe5f9186e42c2.jpg')
cv.namedWindow('input_image', cv.WINDOW_NORMAL) #设置为WINDOW_NORMAL可以任意缩放
cv.imshow('input_image', src)
detect_circles_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

结果:
在这里插入图片描述

11.对象测量

def measure_demo(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)ret, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)print("threshold value", ret)cv.imshow("binary", thresh)contours, hierarchy = cv.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)for i, contour in enumerate(contours):  # 遍历全部轮廓area = cv.contourArea(contour)# cv2.boundingRect返回四个参数(x,y)为矩形左上角的坐标,(w,h)是矩形的宽和高x, y, w, h = cv.boundingRect(contour)  # 外接矩形大小rate = min(w, h) / max(w, h)            # 宽高比cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)  # 外接矩形print("contour area ", area)cv.imshow("measure contours", image)

结果:
在这里插入图片描述

12.膨胀腐蚀

膨胀函数

cv2.dilate(img,kernel,iterations)

其中:
第一个参数:img指需要腐蚀的图

第二个参数:kernel指腐蚀操作的内核,默认是一个简单的3X3矩阵,我们也可以利用getStructuringElement()函数指明它的形状

第三个参数:iterations指的是腐蚀次数,省略是默认为1

import cv2 as cvdef dilate_demo(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)cv.imshow("binary", binary)kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))dst = cv.dilate(binary, kernel)cv.imshow("dilate", dst)src = cv.imread("shufa.jpg")
cv.imshow("shufa", src)
# erode_demo(src)
dilate_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

结果:
欧恩张
膨胀操作会把二值化图像中白色区域不断扩大
腐蚀:

import cv2 as cvdef erode_demo(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)cv.imshow("binary", binary)kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))dst = cv.erode(binary, kernel)cv.imshow("erode", dst)src = cv.imread("C:/Users/H/Desktop/13d98c6f3117f0a19b9d40c44ac7a30f.jpg")
cv.imshow("shufa", src)
# erode_demo(src)
erode_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()


腐蚀操作会把二值化图像白色区域减少,从而实现消除一些白点干扰的目的。

13.开闭操作

开操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的;主要是应用在二值图像分析中,灰度图像亦可

开操作 = 腐蚀+膨胀 ,输入图像 + 结构元素

作用:用来消除小物体、平滑较大物体的边界的同时并不明显改变其面积,提取水平或竖直的线

闭操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的;主要是应用在二值图像分析中,灰度图像亦可

闭操作 = 膨胀+腐蚀 ,输入图像 + 结构元素

作用:用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积

import cv2 as cvimport cv2def open_demo(image):print(image.shape)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)binary = cv2.bitwise_not(binary)cv2.imshow("binary_open", binary)#通过修改核实现不同规格的开操作,或者横线竖线提取kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 1))binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)cv2.imshow("open result", binary)def close_demo(image):print(image.shape)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)cv2.imshow("binary_close", binary)kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)cv2.imshow("close result", binary)src = cv.imread("C:/Users/H/Desktop/111.png")
cv.imshow("src", src)
# erode_demo(src)
open_demo(src)cv.waitKey(0)
cv.destroyAllWindows()

开操作消除小物体,平滑大物体边界结果:
在这里插入图片描述
开操作提取竖线结果:
在这里插入图片描述
开操作提取横线结果:

在这里插入图片描述

闭操作填充细小空间结果:
在这里插入图片描述

14.分水岭算法

如果图像中的目标物体是连接在一起的,则分割起来会更困难,分水岭分割算法经常用于处理这类问题,通常会取得比较好的效果。分水岭分割算法把图像看成一幅“地形图”,其中亮度比较强的区域像素值较大,而比较暗的区域像素值较小,通过寻找“汇水盆地”和“分水岭界限”,对图像进行分割。
在这里插入图片描述
代码流程:

import cv2
import numpy as np# 分割连在一块的硬币
img = cv2.imread('C:/Users/H/Desktop/20190315155813439.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Otsu's二值化
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
cv2.imshow('thresh', thresh)
# noise removal
kernel = np.ones((3, 3), np.uint8)
#开运算  去除小物体影响 去除图像中的所有的白噪声
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
cv2.imshow('opening', opening)
#膨胀可以将对象的边界延伸到背景中去。这样由于边界区域被去处理,我们就可以知道那些区域肯定是前景,那些肯定是背景。
sure_bg = cv2.dilate(opening, kernel, iterations=3)
cv2.imshow('sure_bg', sure_bg)
# 距离变换分割出来
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
ret, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)# 得到确定是硬币的区域和不确定的区域
sure_fg = np.uint8(sure_fg)
cv2.imshow('sure_fg', sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)
cv2.imshow('unknown', unknown)
# Marker labelling 标记背景为0
ret, markers = cv2.connectedComponents(sure_fg)# Add one to all labels so that sure background is not 0, but 1  背景标记为1
markers = markers + 1# Now, mark the region of unknown with zero 不确定位置标记为0
markers[unknown == 255] = 0markers = cv2.watershed(img, markers) #实施分水岭
img[markers == -1] = [255, 0, 0]cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:
可以分别看到整个过程,图像二值化、开操作去除噪点、膨胀操作得到前景背景分割、距离变换分割确定硬币区域、用膨胀部分减去确定硬币部分得到未确定部分、标记进行分水岭操作。
在这里插入图片描述

这篇关于python+opencv3图像处理学习记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/916957

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(