图像腐蚀
import cv2
import numpy as np
im = cv2.imread("../dataset/data/5.png")
cv2.imshow("im", im)
kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(im,
kernel,
iterations=3)
cv2.imshow("erosion", erosion)
cv2.waitKey()
cv2.destroyAllWindows()
图像膨胀
import cv2
import numpy as np
im = cv2.imread("../dataset/data/6.png")
cv2.imshow("im", im)
kernel = np.ones((3, 3), np.uint8)
dilation = cv2.dilate(im,
kernel,
iterations=10)
cv2.imshow("dilation", dilation)
cv2.waitKey()
cv2.destroyAllWindows()
图像开运算
import cv2
import numpy as np
im1 = cv2.imread("../dataset/data/7.png")
im2 = cv2.imread("../dataset/data/8.png")
k = np.ones((10, 10), np.uint8)
r1 = cv2.morphologyEx(im1, cv2.MORPH_OPEN, k)
r2 = cv2.morphologyEx(im2, cv2.MORPH_OPEN, k)
cv2.imshow("im1", im1)
cv2.imshow("result1", r1)
cv2.imshow("im2", im2)
cv2.imshow("result2", r2)
cv2.waitKey()
cv2.destroyAllWindows()
图像闭运算
import cv2
import numpy as np
im1 = cv2.imread("../dataset/data/9.png")
im2 = cv2.imread("../dataset/data/10.png")
k = np.ones((8, 8), np.uint8)
r1 = cv2.morphologyEx(im1, cv2.MORPH_CLOSE, k, iterations=2)
r2 = cv2.morphologyEx(im2, cv2.MORPH_CLOSE, k, iterations=2)
cv2.imshow("im1", im1)
cv2.imshow("result1", r1)
cv2.imshow("im2", im2)
cv2.imshow("result2", r2)
cv2.waitKey()
cv2.destroyAllWindows()
形态学梯度
import cv2
import numpy as np
o = cv2.imread("../dataset/data/6.png")
k = np.ones((3, 3), np.uint8)
r = cv2.morphologyEx(o, cv2.MORPH_GRADIENT, k)
cv2.imshow("original", o)
cv2.imshow("result", r)
cv2.waitKey()
cv2.destroyAllWindows()
模糊处理
import cv2
import numpy as np
im = cv2.imread("../dataset/data/lena.jpg", 0)
cv2.imshow("orig", im)
im_median_blur = cv2.medianBlur(im, 5)
cv2.imshow('median_blur', im_median_blur)
im_mean_blur = cv2.blur(im, (3, 3))
cv2.imshow("mean_blur", im_mean_blur)
im_gaussian_blur = cv2.GaussianBlur(im, (5, 5), 3)
cv2.imshow("gaussian_blur", im_gaussian_blur)
gaussan_blur = np.array([
[1, 4, 7, 4, 1],
[4, 16, 26, 16, 4],
[7, 26, 41, 26, 7],
[4, 16, 26, 16, 4],
[1, 4, 7, 4, 1]], np.float32) / 273
im_gaussian_blur2 = cv2.filter2D(im, -1, gaussan_blur)
cv2.imshow("gaussian_blur2", im_gaussian_blur2)
cv2.waitKey()
cv2.destroyAllWindows()
图像锐化处理
import cv2
import numpy as np
im = cv2.imread("../dataset/data/lena.jpg", 0)
cv2.imshow("orig", im)
sharpen_1 = np.array([[-1, -1, -1],
[-1, 9, -1],
[-1, -1, -1]])
im_sharpen1 = cv2.filter2D(im, -1, sharpen_1)
cv2.imshow("sharpen_1", im_sharpen1)
sharpen_2 = np.array([[0, -1, 0],
[-1, 8, -1],
[0, 1, 0]]) / 4.0
im_sharpen2 = cv2.filter2D(im, -1, sharpen_2)
cv2.imshow("sharpen_2", im_sharpen2)
cv2.waitKey()
cv2.destroyAllWindows()
边沿检测
import cv2 as cv
im = cv.imread('../dataset/data/lily.png', 0)
cv.imshow('Original', im)
hsobel = cv.Sobel(im, cv.CV_64F, 1, 0, ksize=5)
cv.imshow('H-Sobel', hsobel)
vsobel = cv.Sobel(im, cv.CV_64F, 0, 1, ksize=5)
cv.imshow('V-Sobel', vsobel)
sobel = cv.Sobel(im, cv.CV_64F, 1, 1, ksize=5)
cv.imshow('Sobel', sobel)
laplacian = cv.Laplacian(im, cv.CV_64F)
cv.imshow('Laplacian', laplacian)
canny = cv.Canny(im,
50,
240)
cv.imshow('Canny', canny)
cv.waitKey()
cv.destroyAllWindows()
轮廓处理
import cv2
import numpy as np
im = cv2.imread("../dataset/data/3.png")
cv2.imshow("orig", im)
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
img, contours, hierarchy = cv2.findContours(binary,
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_NONE)
arr_cnt = np.array(contours)
print(arr_cnt[0].shape)
print(arr_cnt[1].shape)
print(arr_cnt[2].shape)
print(arr_cnt[3].shape)
im_cnt = cv2.drawContours(im,
contours,
-1,
(0, 0, 255),
2)
cv2.imshow("im_cnt", im_cnt)
cv2.waitKey()
cv2.destroyAllWindows()
绘制矩形包围框
retval = cv2.boundingRect(array)
x,y,w,h = cv2.boundingRect(array)
"""
参数:
array:是灰度图像或轮廓
返回值:
retval:表示返回的矩形边界的左上角顶点的坐标值及矩形边界的宽度和高度
x, y, w, h: 矩形边界左上角顶点的x坐标、y坐标、宽度、高度
"""
import cv2
import numpy as np
im = cv2.imread("../dataset/data/cloud.png", 0)
cv2.imshow("orig", im)
ret, binary = cv2.threshold(im, 127, 255, cv2.THRESH_BINARY)
img, contours, hierarchy = cv2.findContours(binary,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_NONE)
print("contours[0].shape:", contours[0].shape)
x, y, w, h = cv2.boundingRect(contours[0])
print("x:", x, "y:", y, "w:", w, "h:", h)
brcnt = np.array([[[x, y]], [[x + w, y]], [[x + w, y + h]], [[x, y + h]]])
cv2.drawContours(im,
[brcnt],
-1,
(255, 255, 255),
2)
cv2.imshow("result", im)
cv2.waitKey()
cv2.destroyAllWindows()
绘制圆形包围框
center,radius=cv2.minEnclosingCircle(points)
"""
参数:
points: 轮廓数组
返回值:
center: 最小包围圆形的中心
radius: 最小包围圆形的半径
"""
import cv2
import numpy as np
im = cv2.imread("../dataset/data/cloud.png", 0)
cv2.imshow("orig", im)
ret, binary = cv2.threshold(im, 127, 255, cv2.THRESH_BINARY)
img, contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
(x, y), radius = cv2.minEnclosingCircle(contours[0])
center = (int(x), int(y))
radius = int(radius)
cv2.circle(im, center, radius, (255, 255, 255), 2)
cv2.imshow("result", im)
cv2.waitKey()
cv2.destroyAllWindows()
绘制拟合椭圆
retval=cv2.fitEllipse(points)
"""
参数:
points: 轮廓
返回值:
retval: 为RotatedRect类型的值,包含外接矩形的质心、宽、高、旋转角度等参数信息,这些信息正好与椭圆的中心点、轴长度、旋转角度等信息吻合
"""
import cv2
import numpy as np
im = cv2.imread("../dataset/data/cloud.png")
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow("orig", gray)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
img, contours, hierarchy = cv2.findContours(binary,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_NONE)
ellipse = cv2.fitEllipse(contours[0])
print("ellipse:", ellipse)
cv2.ellipse(im, ellipse, (0, 0, 255), 2)
cv2.imshow("result", im)
cv2.waitKey()
cv2.destroyAllWindows()
逼近多边形
approxCurve = cv2.approxPolyDP(curve,epsilon,closed)
"""
参数:
curve: 轮廓
epsilon: 精度,原始轮廓的边界点与逼近多边形边界之间的最大距离
closed: 布尔类型,该值为True时,逼近多边形是封闭的;否则,逼近多边形是不封闭的
返回值:
approxCurve: 逼近多边形的点集
"""
import cv2
import numpy as np
im = cv2.imread("../dataset/data/cloud.png")
cv2.imshow("im", im)
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
img, contours, hierarchy = cv2.findContours(binary,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_NONE)
adp = im.copy()
epsilon = 0.005 * cv2.arcLength(contours[0], True)
approx = cv2.approxPolyDP(contours[0], epsilon, True)
adp = cv2.drawContours(adp, [approx], 0, (0, 0, 255), 2)
cv2.imshow("result_0.005", adp)
adp2 = im.copy()
epsilon = 0.01 * cv2.arcLength(contours[0], True)
approx = cv2.approxPolyDP(contours[0], epsilon, True)
adp = cv2.drawContours(adp2, [approx], 0, (0, 0, 255), 2)
cv2.imshow("result_0.01", adp2)
cv2.waitKey()
cv2.destroyAllWindows()