python+OpenCV的简单图像操作
准备
库:OpenCV、numpy、matplotlib
编译环境:pycharm
环境配置:Python+pycharm+OpenCV配置
其中,在使用pycharm显示直方图的过程中,出现了could not find or load the Qt platform plugin '‘windows’'的问题。解决方法.
实现
1.灰度图像
图片的灰度转换有以下几种方式:
(1)使用imread()函数对图片进行灰度化处理,只需要把函数的第二个参数改为0即可。其中参数为1时返回3通道图片,参数小于0时返回原始图片。
import cv2
img0 = cv2.imread('2.jpg',1)
img1 = cv2.imread('2.jpg',0)
img0 = cv2.resize(img0, (552, 328), interpolation=cv2.INTER_CUBIC)
img1 = cv2.resize(img1, (552, 328), interpolation=cv2.INTER_CUBIC)
cv2.imshow('gary',img1)
cv2.imshow('origin',img0)
cv2.waitKey(0)
效果图:
左边图片为参数为1的情况(即原图),右边图片为参数为0时的灰度图片
(2)使用cvtColor(input_image,type)函数
其中:BGR和灰度图的转换使用 cv2.COLOR_BGR2GRAY
BGR和HSV的转换使用 cv2.COLOR_BGR2HSV
import cv2
#读取彩色原图
src=cv2.imread('D:/pycharmfile/test/3.jpg',1)
dst=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
cv2.imshow('gary',dst)
cv2.waitKey(0)
效果图:
2.直方图
一般情况下直方图都是灰度图像,直方图x轴是灰度值(一般0~255),y轴就是图像中每一个灰度级对应的像素点的个数。
我使用的函数为matplotlib中的hist()函数
import cv2 as cv
from matplotlib import pyplot as plt
import numpy as np
path = 'D:/pycharmfile/test/3.jpg'
img = cv.imread(path, 0)#先取灰度图像
plt.hist(img.ravel(), 256, [0, 256])
plt.show()
效果图:
3.直方图均衡化
直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法,即把上面的直方图集中的部分拉伸开。
因为原图是彩色图像,所以在均值化的过程中需要分成三个通道分别均衡化,然后再合并。
img = cv2.imread("D:/pycharmfile/test/3.jpg", 1)
# img = cv2.resize(img, (552, 328), interpolation=cv2.INTER_CUBIC)
# cv2.imwrite('3.jpg', img)
cv2.imshow("src", img)
# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
cv2.imshow("dst", result)
cv2.waitKey(0)
效果图:
左边图片为原图,右边图片为参数为直方图均衡化的结果
4.高斯滤波
高斯模糊本质上是低通滤波器,输出图像的每个像素点是原图像上对应像素点与周围像素点的加权和。
import cv2
import numpy as np
img = cv2.imread("D:/pycharmfile/test/3.jpg", 1)
img_GaussianBlur=cv2.GaussianBlur(img,(7,7),0)
cv2.imshow("origin", img)
cv2.imshow("GaussianBlur", img_GaussianBlur)
cv2.waitKey(0)
效果图:
左边图片为原图,右边图片为参数为高斯滤波的结果
5.高斯双边滤波
是一种可以保边去噪的滤波器。可以滤除图像数据中的噪声,且还会保留住图像的边缘、纹理等(因噪声是高频信号,边缘、纹理也是高频信息,高斯滤波会在滤除噪声的同时使得边缘模糊)。
但是,其速度比绝大多数滤波器都慢。
img_bilateralFilter=cv2.bilateralFilter(img,40,75,75)
效果图:
左边图片为原图,右边图片为参数为双边高斯滤波的结果
可以看出来比起高斯滤波,双边高斯滤波保存住了图像更多的纹理和边缘,在平坦区(草地)的滤波效果更加明显。