Python+OpenCV實現(xiàn)六種常用圖像特效
圖像融合
按照一定的比例將兩張圖片融合在一起
addWeighted()方法:
- 參數(shù)1第一張圖片矩陣
- 參數(shù)2第一張圖片矩陣的權(quán)重
- 參數(shù)3第二張圖片矩陣
- 參數(shù)4第二張圖片矩陣的權(quán)重
- 融合之后的偏移量
進行疊加的兩張圖片寬高應該相同
疊加之后的像素偏移值如果填的話不要填太大,超過255會導致圖像偏白
import cv2
import cv2 as cv
img = cv.imread("img/lena.jpg")
tony = cv.imread("img/tony.jpg", )
# 修改lena圖片的寬高 融合圖像之前兩個圖片的寬高要保持一樣
height, width = img.shape[0:2]
new_height = int(height * 1.5)
new_width = int(width * 2)
new_img = cv2.resize(img, (new_width, new_height))
# 進行疊加時的插值
dst = cv.addWeighted(new_img, 0.5, tony, 0.5, 0)
cv.imshow("dst", dst)
cv.waitKey(0)
cv.destroyAllWindows()

灰度處理
一張彩色圖片通常是由BGR三個通道疊加而成
為了便于圖像特征識別,我們通常會將一張彩色圖片轉(zhuǎn)成灰度圖片來進行分析,當我們轉(zhuǎn)成灰色圖片之后,圖片中邊緣,輪廓特征仍然是能夠清晰看到的,況且在這種情況下我們僅需要對單一通道進行分析,會簡化很多操作
1.前面說的可以讀取圖片時以灰度的方式讀取
import cv2
img = cv2.imread("img/lena.jpg", cv.IMREAD_GRAYSCALE)
2.BGR轉(zhuǎn)灰度圖
import cv2
img = cv2.imread("img/lena.jpg", cv.IMREAD_COLOR)
# 將原圖的所有顏色轉(zhuǎn)成灰色
dstImg = cv2.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow("dstImg", dstImg)
cv.waitKey(0)
顏色反轉(zhuǎn)
灰度反轉(zhuǎn)
灰度圖中每一個像素點都是0~255組成,如果一個像素點為100,反轉(zhuǎn)之后就是255 - 100 = 155
import cv2 as cv
img = cv.imread("img/lena.jpg", cv.IMREAD_COLOR)
# 將原圖的所有顏色轉(zhuǎn)成灰色
dstImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 獲取高度和寬度
height, width = dstImg.shape[0:2]
# 遍歷每一個像素點
for row in range(height):
for col in range(width):
# 255 - 每一個像素點 = 反轉(zhuǎn)后的顏色
dstImg[row, col] = 255 - dstImg[row, col]
cv.imshow("dstImg", dstImg)
cv.waitKey(0)

彩色反轉(zhuǎn)
一樣的道理,彩色圖片有BGR三個顏色通道,每一個顏色都取反
255 - B = B1 255 - G = G1 255 - R = R1
import cv2 as cv
img = cv.imread("img/lena.jpg", cv.IMREAD_COLOR)
# 將原圖的所有顏色轉(zhuǎn)成灰色
dstImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 獲取高度和寬度
height, width = dstImg.shape[0:2]
# 遍歷每一個像素點
for row in range(height):
for col in range(width):
# 255 - 每一個像素點 = 反轉(zhuǎn)后的顏色
dstImg[row, col] = 255 - dstImg[row, col]
cv.imshow("dstImg", dstImg)
cv.waitKey(0)

馬賽克效果
馬賽克指現(xiàn)行廣為使用的一種圖像(視頻)處理手段,此手段將影像特定區(qū)域的色階細節(jié)劣化并造成色塊打亂的效果,因為這種模糊看上去有一個個的小格子組成,便形象的稱這種畫面為馬賽克。其目的通常是使之無法辨認。

import cv2
# 讀取圖片 cv2讀取出的圖片都是一個二維矩陣
img = cv2.imread('./img/lena.jpg', cv2.IMREAD_COLOR)
# 切片 兩個點的坐標可以截取圖片
# x1:x2,y1:y2 截取眼睛部分
img1 = img[180:250, 180:310]
# 獲取到高度和寬度
height, width = img1.shape[0:2]
# 遍歷每一個像素點
for row in range(height):
for col in range(width):
# 如果正好為10的倍數(shù)的行并且是10的倍數(shù)的列
if row % 10 == 0 and col % 10 == 0:
# 獲取到這個像素點的bgr三原色
b, g, r = img1[row, col]
# 遍歷這個像素點旁邊的100個像素點 都等于中間這個像素點
for i in range(10):
for j in range(10):
img1[row + i, col + j] = b, g, r
cv2.imshow('img', img)
cv2.imwrite('msk_lena.jpg', img)
cv2.waitKey()

毛玻璃效果
毛玻璃效果和馬賽克效果相似,馬賽克是:比如4*4的像素點內(nèi)所有像素點都與第一個像素點顏色一樣,毛玻璃效果為遍歷每一個像素點,在該像素點附近隨機選取一個顏色值替換。
偏移量越大越模糊
import random
import cv2
import numpy as np
img = cv2.imread('./lena.jpg')
height, width = img.shape[0:2]
new_img = np.zeros_like(img, np.uint8)
# 定義偏移量
offset = 6
# 遍歷每一個像素點
for row in range(height):
for col in range(width):
# 定義不超過1的隨機值與offset相乘
index = int(random.random() * offset)
# 獲取到隨機完的行號和列號 如果不超過總高度就使用隨機的行 如果超過就使用高度-1
random_row = row + index if row + index < height else height - 1
random_col = col + index if col + index < width else width - 1
# 賦值顏色
b, g, r = img[random_row, random_col]
new_img[row, col] = b, g, r
cv2.imshow('img', img)
cv2.imshow('new_img', new_img)
cv2.waitKey()

浮雕效果
浮雕效果公式:new_gray = gray0-gray1+120
加120是為了增加灰度值
import cv2
import numpy as np
img = cv2.imread('./lena.jpg')
# 獲取高度寬度
height, width = img.shape[0:2]
# 轉(zhuǎn)為灰度圖
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
new_img = np.zeros_like(gray_img, np.uint8)
# 遍歷每一個像素點
for row in range(height):
# 因為要獲取相鄰的像素點 防止下標越界提前遍歷的時候?qū)挾?1
for col in range(width - 1):
# 獲取像素點的像素值
gray0 = gray_img[row, col]
# 獲取相鄰像素點的像素值
gray1 = gray_img[row, col + 1]
# 使用浮雕效果的公式
new_gray = int(gray0) - int(gray1) + 120
# 判斷新的灰度值是否越界
if new_gray > 255:
new_gray = 255
elif new_gray < 0:
new_gray = 0
# 賦值
new_img[row, col] = new_gray
cv2.imshow('img', img)
cv2.imshow('new_img', new_img)
cv2.waitKey()

到此這篇關(guān)于Python+OpenCV實現(xiàn)六種常用圖像特效的文章就介紹到這了,更多相關(guān)Python OpenCV圖像特效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyQt5 QTreeWidget 樹形結(jié)構(gòu)遞歸遍歷當前所有節(jié)點的實現(xiàn)
Qt中實現(xiàn)樹形結(jié)構(gòu)可以使用QTreeWidget類,也可以使用QTreeView類,本文主要介紹了PyQt5 QTreeWidget 樹形結(jié)構(gòu)遞歸遍歷當前所有節(jié)點的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
Python報錯:OSError:?[Errno?22]?Invalid?argument解決方案及應用實例
最近跑別人的項目遇到一個這樣的問題一開始以為是沒有用管理員的權(quán)限運行,導致創(chuàng)建不了日志文件后來發(fā)現(xiàn)是和windows的命名規(guī)則沖突了,這篇文章主要給大家介紹了關(guān)于Python報錯:OSError:?[Errno?22]?Invalid?argument的解決方案及應用實例,需要的朋友可以參考下2024-07-07
Python計數(shù)器collections.Counter用法詳解
本文主要介紹了Python計數(shù)器collections.Counter用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03
Python中的異常處理相關(guān)語句基礎(chǔ)學習筆記
這里我們簡單整理一下Python中的異常處理相關(guān)語句基礎(chǔ)學習筆記,包括try...except與assert等基本語句的用法講解:2016-07-07
matplotlib subplots 設(shè)置總圖的標題方法
今天小編就為大家分享一篇matplotlib subplots 設(shè)置總圖的標題方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
如何徹底解決python?NameError:name?'__file__'?is?not?
這篇文章主要給大家介紹了關(guān)于如何徹底解決python?NameError:name?'__file__'?is?not?defined的相關(guān)資料,文中通過圖文將解決的辦法介紹的非常詳細,需要的朋友可以參考下2023-02-02

