opencv入門---opencv 3

圖像亮度和對比對操作

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] 歡迎交流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章