【OpenCV】python+PyQt项目实战!

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

==PP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值