中央电视台,中央电视台,欢迎大家来到今日份opencv效果展示,下面介绍一下参赛选手,我家著名选狗,咩咩狗,今天大家看看咩咩的几幅不同的面孔。
来给大家叫两声,汪,汪
1.灰度化
直接上代码,默认大家都会读图
import cv2
path = r'./miemie4.jpg'
ori_image = cv2.imread(path)
cv2.imshow('ori_image',ori_image)
#灰度化
gray_image = cv2.cvtColor(ori_image, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray_image',gray_image)
cv2.waitKey()
感觉不大对劲,当世界变灰,总会给人一种它不在了的迹象,其实它活蹦乱跳的一批啊,其实还有一种方式
import cv2
path = r'./miemie4.jpg'
ori_image = cv2.imread(path,0)
cv2.imshow('ori_image',ori_image)
cv2.waitKey()
看出来哪里不一样了吗,imread后面多了一个0,表示读图的模式0表示以灰度图读进来,-1表示以原图读进来,1也有一个模式,但是不建议使用。show出来和刚刚没什么两样
2.二值化
二值化啥意思,顾名思义,就是二值化,二值化的效果主要看什么,主要看你设定的阈值高低,我这里演示的都是127的阈值,意思就是大于127,变成255,小于127变成0(或者反过来),这个还取决于你的二值化方式,直接上代码看看,我都说的是什么,一下就明白了
import cv2
path = r'./miemie4.jpg'
ori_image = cv2.imread(path)
# cv2.imshow('ori_image',ori_image)
#灰度化
gray_image = cv2.cvtColor(ori_image, cv2.COLOR_BGR2GRAY)
# cv2.imshow('gray_image',gray_image)
#二值化
ret, th1 = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
ret, th2 = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY_INV)
ret, th3 = cv2.threshold(gray_image, 127, 255, cv2.THRESH_TRUNC)
ret, th4 = cv2.threshold(gray_image, 127, 255, cv2.THRESH_TOZERO)
ret, th5 = cv2.threshold(gray_image, 127, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow('th1',cv2.resize(th1,(int(th1.shape[1]/2),int(th1.shape[0]/2))))
cv2.imshow('th2',cv2.resize(th2,(int(th1.shape[1]/2),int(th1.shape[0]/2))))
cv2.imshow('th3',cv2.resize(th3,(int(th1.shape[1]/2),int(th1.shape[0]/2))))
cv2.imshow('th4',cv2.resize(th4,(int(th1.shape[1]/2),int(th1.shape[0]/2))))
cv2.imshow('th5',cv2.resize(th5,(int(th1.shape[1]/2),int(th1.shape[0]/2))))
cv2.waitKey()
做个简单说明,刚刚说的那个阈值就是下面左边箭头那个位置,二值化的方式就是右边那个箭头的那个位置,一共有5种,其实还有几种,常见的就是这几种,值得一提的是还有自适应阈值的二值化方式,这里先不介绍。
效果图展示一下,传说中的人模狗样吧,这么说也不合适,关键没有人样啊
再来个阈值50,看看效果
算了算了不试了,看不下去了。
稍微提醒一下,一般二值化的动作会接在灰度化之后,可以说这是一套相当强力的组合拳。各位看UFC和MMA吗?建议看看嘴炮麦康纳和毒液佩奇的比赛,真的挺有意思。
3.Canny
提供canny的写法,上代码
import cv2
path = r'./miemie4.jpg'
ori_image = cv2.imread(path)
cv2.imshow('ori_image',ori_image)
canny = cv2.Canny(ori_image,50,100)
cv2.imshow('Canny_edge_0',canny)
blurred = cv2.GaussianBlur(ori_image, (3,3), 0)
gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
# 求X方向上的梯度
grad_x = cv2.Sobel(gray, cv2.CV_16SC1, 1, 0)
# 求y方向上的梯度
grad_y = cv2.Sobel(gray, cv2.CV_16SC1, 0, 1)
# 将梯度值转化到8位上来
x_grad = cv2.convertScaleAbs(grad_x)
y_grad = cv2.convertScaleAbs(grad_y)
# 将两个梯度组合起来
src1 = cv2.addWeighted(x_grad, 0.5, y_grad, 0.5, 0)
# 组合梯度用canny算法,其中50和100为阈值
edge = cv2.Canny(src1, 50, 100)
cv2.imshow("Canny_edge_1", edge)
edge1 = cv2.Canny(grad_x, grad_y, 10, 100)
cv2.imshow("Canny_edge_2", edge1)
cv2.waitKey()
可以比较一下,三个canny出来的图的差距还是挺大的,大家可以自行对比一下代码,看看都是咋回事,还有你觉得那个图表现得额最好。
由于今天工作强大比较大,先更新到这里。比赛还没有结束,咩咩狗作为种子选手,在下半场又会给我们带来怎么样的表现呢?暂定一下,马上回来,下半场啥时候,看工作强大而定
值得一提的事,今天办公室让抽签看看这周谁是清洁委员,老板让我写一个代码来抽签,我写的代码还能抽到我,我也是真实在啊,就是做个弊谁能知道呢,害,还是太正直了。希望下次抽签random这个库给我几分薄面。
至此,敬礼,salute!!!