1. 安装和配置环境:
python-3.7.8rc1-amd64
PyQt5安装:
pip install pyqt5 -i https://mirrors.aliuyun.com/pypi/simple
spyder安装:
pip install spyder
2. 实际应用
GUI界面如下图所示
1.导入图片,进行图像灰度处理
图片灰度化处理代码如下:
def click_pushButton_2(self): # 点击 pushButton_2
print("pushButton_2")
self.img2 = cv.cvtColor(self.img1, cv.COLOR_BGR2GRAY) # 图片格式转换:BGR -> Gray
self.refreshShow(self.img2, self.label_2) # 刷新显示
return
输出:
2.往图片中添加文字:
from PIL import Image, ImageDraw, ImageFont
if (isinstance(self.img1, np.ndarray)): # 判断是否 OpenCV 图片类型
imgPIL = Image.fromarray(cv.cvtColor(self.img1, cv.COLOR_BGR2RGB))
text = num
pos = (50, 20) # (left, top),字符串左上角坐标
color = (0, 255, 0) # 字体颜色
textSize = 40
drawPIL = ImageDraw.Draw(imgPIL)
fontText = ImageFont.truetype("font/simsun.ttc", textSize, encoding="utf-8")
drawPIL.text(pos, text, color, font=fontText)
self.imgPutText = cv.cvtColor(np.asarray(imgPIL), cv.COLOR_RGB2BGR)
self.refreshShow1(self.imgPutText, self.label_2) # 刷新显示
return
输出:
3.图片色阶调整
def levelsAdjust(img, Sin=0, Hin=255, Mt=1.0, Sout=0, Hout=255):
Sin = min(max(Sin, 0), Hin-2) # Sin, 黑场阈值, 0<=Sin<Hin
Hin = min(Hin, 255) # Hin, 白场阈值, Sin<Hin<=255
Mt = min(max(Mt, 0.01), 9.99) # Mt, 灰场调节值, 0.01~9.99
Sout = min(max(Sout, 0), Hout-2) # Sout, 输出黑场阈值, 0<=Sout<Hout
Hout = min(Hout, 255) # Hout, 输出白场阈值, Sout<Hout<=255
difIn = Hin - Sin
difOut = Hout - Sout
table = np.zeros(256, np.uint16)
for i in range(256):
V1 = min(max(255 * (i-Sin)/difIn,0), 255)
V2 = 255 * np.power(V1/255, 1/Mt)
table[i] = min(max(Sout+difOut*V2/255, 0), 255)
imgTone = cv.LUT(img, table)
return imgTone
# img = cv.imread("../images/buddha01.png", flags=1) # 读取彩色
equ1 = levelsAdjust(self.img1, 10, 225, 1.0, 10, 245)
equ2 = levelsAdjust(self.img1, 10, 225, 1.2, 10, 245)
plt.figure(figsize=(9, 6))
plt.subplot(131), plt.title("origin"), plt.axis('off')
plt.imshow(cv.cvtColor(self.img1, cv.COLOR_BGR2RGB))
plt.subplot(132), plt.title("colorEqu1"), plt.axis('off')
plt.imshow(cv.cvtColor(equ1, cv.COLOR_BGR2RGB))
plt.subplot(133), plt.title("colorEqu2"), plt.axis('off')
plt.imshow(cv.cvtColor(equ2, cv.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()
def autoLevels(img, cutoff=0.1):
channels = img.shape[2] # h,w,ch
table = np.zeros((1,256,3), np.uint8)
for ch in range(channels):
# cutoff=0.1, 计算 0.1%, 99.9% 分位的灰度值
low = np.percentile(img[:,:,ch], q=cutoff) # ch 通道, cutoff=0.1, 0.1 分位的灰度值
high = np.percentile(img[:,:,ch], q=100 - cutoff) # 99.9 分位的灰度值, [0, high] 占比99.9%
# 输入动态线性拉伸
Sin = min(max(low, 0), high - 2) # Sin, 黑场阈值, 0<=Sin<Hin
Hin = min(high, 255) # Hin, 白场阈值, Sin<Hin<=255
difIn = Hin - Sin
V1 = np.array([(min(max(255*(i-Sin)/difIn, 0), 255)) for i in range(256)])
# 灰场伽马调节
gradMed = np.median(img[:,:,ch]) # 拉伸前的中值
Mt = V1[int(gradMed)] / 128. # 拉伸后的映射值
V2 = 255 * np.power(V1/255, 1/Mt) # 伽马调节
# 输出线性拉伸
Sout, Hout = 5, 250 # Sout 输出黑场阈值, Hout 输出白场阈值
difOut = Hout - Sout
table[0, :, ch] = np.array([(min(max(Sout + difOut*V2[i]/255, 0), 255)) for i in range(256)])
return cv.LUT(img, table)
# Photoshop 自动色阶调整算法
# img = cv.1imread("tu.jpg", flags=1) # 读取彩色图像
gray = cv.cvtColor(self.img1, cv.COLOR_BGR2GRAY) # 转换为灰度图像
print("cutoff={}, minG={}, maxG={}".format(0.0, gray.min(), gray.min()))
# 色阶手动调整
equManual = levelsAdjust(self.img1, 63, 205, 0.8, 10, 245) # 手动调节
# 色阶自动调整
cutoff = 0.1 # 截断比例, 建议范围 [0.0,1.0]
equAuto = autoLevels(self.img1, cutoff)
plt.figure(figsize=(9, 6))
plt.subplot(131), plt.title("Origin"), plt.axis('off')
plt.imshow(cv.cvtColor(self.img1, cv.COLOR_BGR2RGB))
plt.subplot(132), plt.title("ManualTuned"), plt.axis('off')
plt.imshow(cv.cvtColor(equManual, cv.COLOR_BGR2RGB))
plt.subplot(133), plt.title("AutoLevels"), plt.axis('off')
plt.imshow(cv.cvtColor(equAuto, cv.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()
return
输出:
4.视频播放及截屏操作
3.总结
OpenCV涉及领域十分广泛,持续学习中,也推荐一个博主@youcans_,教程十分给力。
@Neng