前言
最近对图像处理方面比较感兴趣,所以记录一下自己的学习过程同时也分享自己的学习结果。对于Opencv是图像处理里面不可或缺的一部分,所以我就使用Opencv来简单处理一张图片,图片来自我的最爱《权力的游戏》
读取原图并打印
下面代码直接读取图片然后进行打印,这里有两种输出方式,第一种是用非CV库的方式输出,所以一定要加我注释的那句话,不然R,G,B颜色顺序可能是乱的;第二种就不需要了,但是要加最后一句话,不然输出可能会卡或者一闪而过!
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('qy.jpg',1) #注意图片的名称最好不要是中文,不然可能会报错
#第一种输出方式
img = cv2.cvtColor(img , cv2.COLOR_BGR2RGB) #这句一定要加,不然输出图片颜色可能不对
plt.imshow(img )
#第二种输出方式
#cv2.imshow('img',img)
#cv2.waitKey(0) #这句也要加
下面就是打印的图片:
将原图转化为灰度图
转化为灰度图没什么变化,只需要在读取的时候将flags取值为0就行了
img = cv2.imread('qy.jpg',0) #0是flags的取值
img = cv2.cvtColor(img , cv2.COLOR_BGR2RGB)
plt.imshow(img )
输出结果如下:
灰度图像反转
灰度图像每个像素点色彩范围在0-255之间,反转方法直接将255-当前像素值即可
img = cv2.imread('qy.jpg',0)
height, width = img.shape
img_change = np.zeros((height,width,1), np.uint8)
for i in range(0, height):
for j in range(0, width):
gray = img[i, j]
img_change[i, j] = 255-gray
img_change = cv2.cvtColor(img_change, cv2.COLOR_BGR2RGB)
plt.imshow(img_change)
输出结果如下图:
彩色图像反转
彩色图像的反转和灰度反转是一样的,只需要将R,G,B三原色的色调反转即可
img = cv2.imread('qy.jpg',1)
height, width, mode = img.shape
img_change = np.zeros((height, width, mode), np.uint8)
for i in range(0, height):
for j in range(0,width):
(b, g, r) = img[i, j]
img_change[i, j] = (255-b,255-g,255-r)
img_change = cv2.cvtColor(img_change, cv2.COLOR_BGR2RGB)
plt.imshow(img_change)
输出结果如下图:
图像对数变换
我们知道其实在处理数据的过程中也经常用到对数变换,对数变换可以将“陡”的数据变得平滑。对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升,所以就可以增强图像的暗部细节。一句话就是可以把暗的调亮。当然出了对数变换还有其他的变换,这里就不举例了。
def log(c, img):
output = c * np.log(1.0 + img)
output = np.uint8(output + 0.5)
return output
img = cv2.imread('qy.jpg',1)
img_output = log(43, img) #这里的c值要设得合适,不然图像会变得很花,不要问我怎么知道的
img_output = cv2.cvtColor(img_output, cv2.COLOR_BGR2RGB)
plt.imshow(img_output)
输出结果如下图:
图像直方图均衡化
首先灰度图像和彩色图像都可以进行直方图均衡化,因为我选择的图片在灰度均衡化什么看不出什么效果,所以这里就举彩色图的例子。
img = cv2.imread('qy.jpg',flags=1)
(b,g,r) = cv2.split(img)
bH = cv2.equalizeHist(b) #这里主要就是这个equalizeHist函数进行均衡化
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
result = cv2.merge((bH,gH,rH))
res = np.hstack((img,result))
res = cv2.cvtColor(res, cv2.COLOR_BGR2RGB)
plt.imshow(res)
plt.show()
均衡化后效果图:
还是可以看出明显的区别
而我们也可以通过图片灰度直方图看出差别,均衡化后的图片更加趋于平滑
均衡化前:
均衡化后:
写在最后
这是学习Opencv基础的第一篇,后面会再有一篇。本人才疏学浅,如果有错误或者理解不到位的地方请指正!