※This article is based on Python 3.7.3
安装命令
pip install opencv-python
import cv2 as cv img = cv.imread("2.jpg") cv.imshow("2", img) cv.waitKey(0) cv.destroyAllWindows()
图像灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
图像二值化
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
groundtruth = cv2.imread(groundtruth_path)[:, :, 0] h1, w1 = groundtruth.shape contours, cnt = cv2.findContours(groundtruth.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if len(contours) != 1:#轮廓总数 continue M = cv2.moments(contours[0]) # 计算第一条轮廓的各阶矩,字典形式 center_x = int(M["m10"] / M["m00"]) center_y = int(M["m01"] / M["m00"]) image = np.zeros([h1, w1], dtype=groundtruth.dtype) cv2.drawContours(image, contours, 0, 255, -1)#绘制轮廓,填充 cv2.circle(image, (center_x, center_y), 7, 128, -1)#绘制中心点 cv2.imwrite("1.png", image)
中值滤波是一种简单而有效的去噪方法,特别适合去除椒盐噪声(随机黑白像素点)。它可以有效地保留图像的边缘信息和细节,但它也可能导致图像变得模糊,特别是在大尺寸滤波器的情况下。
import cv2 img = cv2.imread('image.jpg') median = cv2.medianBlur(img, 5) cv2.imshow('Median filter', median) cv2.waitKey(0) cv2.destroyAllWindows()
高斯滤波器是一种线性滤波器,适用于去除高斯噪声(随机高斯分布的噪声)。它通过对周围像素的加权平均来减少噪声,并在去除噪声的同时保留图像的边缘信息。与中值滤波相比,它可以更好地控制模糊程度,但它不能有效地去除椒盐噪声。
import cv2 img = cv2.imread('image.jpg') gaussian = cv2.GaussianBlur(img, (5,5), 0) cv2.imshow('Gaussian filter', gaussian) cv2.waitKey(0) cv2.destroyAllWindows()
双边滤波是一种非线性滤波器,可以同时平滑像素的颜色和保留边缘信息。它可以去除高斯噪声和椒盐噪声,并且相对于其他滤波器,双边滤波器的效果更好。但是,双边滤波器需要更长的处理时间,并且可能会在图像中引入一些新的噪声。
import cv2 img = cv2.imread('image.jpg') bilateral = cv2.bilateralFilter(img, 9, 75, 75) cv2.imshow('Bilateral filter', bilateral) cv2.waitKey(0) cv2.destroyAllWindows()
小波变换可以分解图像成不同频率的细节信息,从而可以选择性地去除噪声。小波变换通常用于处理高斯噪声和其他复杂的噪声类型。小波变换可以同时保留图像的边缘和细节信息,但它可能会引入一些新的噪声,并且需要更长的处理时间。
import cv2 import pywt img = cv2.imread('image.jpg', 0) coeffs = pywt.dwt2(img, 'haar') cA, (cH, cV, cD) = coeffs cv2.imshow('Wavelet denoising', pywt.idwt2((cA, (None, None, None)), 'haar')) cv2.waitKey(0) cv2.destroyAllWindows()
设置相机id之后还要设置一下分辨率,否则某些相机,第二次打不开画面
cap = cv2.VideoCapture(video,cv2.CAP_DSHOW) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) # 设置分辨率 cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) while cap.isOpened(): ... #使用完后,要释放 cap.release() cv2.destroyAllWindows()
有个USB摄像头不使用 cv2.CAP_DSHOW 参数会报错
CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638
コメント: