图像亮度和对比对操作
import numpy as np
import cv2 as cv
def light_constrat_demo():
src = cv.imread("./mm.jpg")
h, w = src.shape[:2]
empty = np.zeros((h // 2, w // 2, 3), src.dtype)
src = cv.resize(src, (w // 2, h // 2), interpolation=cv.INTER_CUBIC)
constast = np.zeros((h // 2, w // 2, 3), np.float32)
constast.fill(0.8)
cv.imshow("input", src)
empty.fill(0) # 提高亮度
cv.imshow("em", empty)
print(empty.shape, src.shape)
dst = cv.add(src, empty)
cv.imshow("dst", dst)
new = cv.add(cv.multiply(np.float32(src), constast), np.float32(empty))
cv.imshow("new", np.uint8(new))
# API
finnal = cv.addWeighted(src, 1.2, empty, 0, 20)
cv.imshow("finna;", finnal)
cv.imwrite("./new_wife.jpg", finnal)
def do_nothing():
pass
def track_linght():
"""
加入滑块
:return:None
"""
src = cv.imread("./mm.jpg")
h, w = src.shape[:2]
src = cv.resize(src, (w // 2, h // 2), interpolation=cv.INTER_CUBIC)
empty = np.zeros(src.shape, src.dtype)
cv.namedWindow("reslut", cv.WINDOW_AUTOSIZE)
# cv.imshow("input", src)
cv.createTrackbar("contrast", "reslut", 0, 100, do_nothing)
cv.createTrackbar("light","reslut",0,100,do_nothing)
while True:
cnt = cv.getTrackbarPos("contrast", "reslut") / 50
light=cv.getTrackbarPos("light","reslut")/3
dst = cv.addWeighted(src, cnt, empty, light, light)
cv.imshow("reslut", dst)
c = cv.waitKey(20)
if c == 27:
break
if __name__ == '__main__':
track_linght()
cv.waitKey(0)
cv.destroyAllWindows()
加入了滑块
图像差值
import numpy as np
import cv2 as cv
def resize_demo():
src = cv.imread("./3.jpg")
cv.imshow("src", src)
h, w = src.shape[:2]
print(h, w)
det = cv.resize(src, (w // 3, h // 3), interpolation=cv.INTER_LINEAR) # (w//2,h//2)宽高都缩小二分之一, interpolation插值方法
cv.imshow("de", det)
da = cv.resize(src, (w * 2, h * 2), interpolation=cv.INTER_CUBIC) # 三次差值放大把他放大,ps所用的方法
cv.imshow("da", da)
if __name__ == '__main__':
resize_demo()
cv.waitKey(0)
cv.destroyAllWindows()
图像缩放的时候需要差值不然会有锯齿
图像旋转
import numpy as np
import cv2 as cv
import math
def ratate_demo():
src = cv.imread("./3.jpg")
cv.imshow("input", src)
dst = cv.rotate(src, rotateCode=cv.ROTATE_90_CLOCKWISE) # rotateCode可以设置旋转角度
cv.imshow("dst", dst)
h, w, ch = src.shape
ch = h // 2
cw = w // 2
M = cv.getRotationMatrix2D((ch, cw), 45, 1.0) # (ch, cw)是中心点,45是旋转的度数,1.0是放大缩小倍数
dst = cv.warpAffine(src, M, (h, w))
cv.imshow("dst2", dst)
if __name__ == '__main__':
ratate_demo()
cv.waitKey(0)
cv.destroyAllWindows()
#图像算术运算
import numpy as np
import cv2 as cv
def suanshu_demo():
src1 = cv.imread("./sum.jpg")
src2 = cv.imread("./mm.jpg")
h, w = src2.shape[:2]
src2 = cv.resize(src2, (w // 2, h // 2), interpolation=cv.INTER_CUBIC)
src1 = cv.resize(src1, (w // 2, h // 2), interpolation=cv.INTER_CUBIC)#将两张图片调整成一样的大小
cv.imshow("zz", src2)
cv.imshow("sum", src1)
#两张图片相加
src2=cv.add(src2,src2)
new_image=cv.add(src2,src1)
new_image=cv.add(new_image,src2)
cv.imshow("new",new_image)
cv.imwrite("wife.jpg",new_image)
new=cv.subtract(src1,src2)
new=cv.add(new,new_image)
cv.imshow("nn",new)
data=cv.multiply(src1,src2)
data=cv.add(data,src2)
cv.imshow("data",data)
if __name__ == '__main__':
suanshu_demo()
cv.waitKey(0)
cv.destroyAllWindows()
其实就是图像的加减乘除操作
女生照片和卡通太阳照片相加的结果
图像的逻辑运算
import numpy as np
import cv2 as cv
def logic_operator():
src1 = np.zeros((400, 400, 3), dtype=np.uint8)
src2 = np.zeros((400, 400, 3), dtype=np.uint8)
cv.rectangle(src1, (100, 100), (300, 300), (255, 0, 255), -1, cv.LINE_8)
cv.rectangle(src2, (20, 20), (220, 220), (255, 255, 0), - 1, cv.LINE_8)
cv.imshow("1", src1)
cv.imshow("2", src2)
src3 = cv.bitwise_and(src1, src2)
cv.imshow("3", src3)
src4 = cv.bitwise_or(src1, src2)
cv.imshow("4", src4)
if __name__ == '__main__':
logic_operator()
cv.waitKey(0)
cv.destroyAllWindows()
色彩空间
常用的是RGB和HSV色彩空间,包括我们常用的灰度图像都算是一种色彩空间。
如果是图像色彩比较鲜艳我们想去用这些颜色去分割背景或者物体的画,我们就可以把RGB图像转换成HSV图像。
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
然后查看HSV的表去取最大最小值
mask = cv.inRange(hsv, (35, 43, 46), (77, 255, 255))
将mask取反
cv.bitwise_not(mask, dst=mask)
相加操作
dst = np.zeros(src.shape, src.dtype)
re = cv.add(src, dst, mask=mask)
以上就实现了神奇的扣绿
这是HSV色彩空间的图像
代码
import numpy as np
import cv2 as cv
def color_space_demo():
src = cv.imread("./2.png")
h, w = src.shape[:2]
# src = cv.resize(src, (w // 2, h // 2), interpolation=cv.INTER_CUBIC)
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
cv.imshow("hh", hsv)
dst = np.zeros(src.shape, src.dtype)
mask = cv.inRange(hsv, (35, 43, 46), (77, 255, 255))
# cv.cvtColor(mask, cv.COLOR_HSV2BGR_FULL)
cv.imshow("maks", mask)
cv.bitwise_not(mask, dst=mask)
re = cv.add(src, dst, mask=mask)
cv.imshow("re", re)
if __name__ == '__main__':
color_space_demo()
cv.waitKey(0)
cv.destroyAllWindows(
图像的像素统计
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
def statistics():
src = cv.imread("./mm.jpg")
h, w = src.shape[:2]
src = cv.resize(src, (w // 2, h // 2), interpolation=cv.INTER_CUBIC)
cv.imshow("src", src)
mbgr = cv.mean(src) # rgb的平均值
# cv.imshow("mean", mbgr)
print("b%d,g%d,r%d" % (mbgr[0], mbgr[1], mbgr[2]))
std = cv.meanStdDev(src) # 方差值
# 绘制图像灰度直方图
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imshow("hui", gray)
hist = np.zeros([256], dtype=np.int32)
for row in range(h):
for col in range(w):
pv = gray[row, col]
hist[pv] += 1
plt.plot(hist, color="r")
plt.xlim([0, 600])
plt.show()
if __name__ == '__main__':
statistics()
cv.waitKey(0)
cv.destroyAllWindows()
author: [email protected] 欢迎交流