首页 > 编程语言 >python opencv图片简单操作

python opencv图片简单操作

时间:2024-08-07 19:58:46浏览次数:14  
标签:img python win self cv2 opencv np def 图片

一、从文件读取图片

cv2.imread(filename, flags)
 参数:
 filepath:读入image的完整路径
 flags:标志位,{cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSCALE,cv2.IMREAD_UNCHANGED}
 cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道,可用1作为实参替代
 cv2.IMREAD_GRAYSCALE:读入灰度图片,可用0作为实参替代
 cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道,可用-1作为实参替代
 PS:alpha通道,又称A通道,是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度复信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明

二、从内存加载图片

cv2.imdecode(buf, flags)
 参数:
buf:通常是numpy.ndarray类型的内存数组
flags:同cv2.imread函数的flags参数

三、保存图片到文件

cv2.imwrite(filename, img,params)
参数:
filename:保存image的完整路径
img:要保存的图像
params:列表参数,比如[cv2.IMWRITE_JPEG_QUALITY,100,cv2.IMWRITE_JPEG_LUMA_QUALITY,10]

四、图片混合

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
参数:
src1:图片1
alpha:图片1权重
src2:图片2
beta:图片2权重
gamma:添加到每个总和的标量。一般为0
dst:输出图片,Python版本不需要指
dtype:输出数组的可选深度,默认即可

五、示例代码
 

import sys
import cv2
import numpy as np
from my_cv_util import MyCvUtil


class CvSimpleDemo(object):
    def __init__(self):
        self.img_1 = None
        self.img_2 = None
        self.alpha = 100
        self.beta = 10

    @staticmethod
    def hello_cv():
        img = cv2.imread("yd.jpg", cv2.IMREAD_COLOR)
        h, w, d = img.shape
        print(h, w, d)
        MyCvUtil.show_img_win(img, 'img')
        MyCvUtil.set_win_title('img', '你好,opencv')

    @staticmethod
    def im_decode():
        img = cv2.imdecode(np.fromfile('p1.jpg', dtype=np.uint8), cv2.IMREAD_UNCHANGED)
        MyCvUtil.show_img_win(img, 'img')
        MyCvUtil.set_win_title('img', '从内存加载图片演示')
        MyCvUtil.set_win_center('img', 800, 600)

    @staticmethod
    def im_read_flags():
        img = cv2.imread("p1.jpg", cv2.IMREAD_ANYDEPTH)
        cv2.imshow("img1", img)
        img = cv2.imread("p1.jpg", cv2.IMREAD_COLOR)
        cv2.imshow("img2", img)
        img = cv2.imread("p1.jpg", cv2.IMREAD_GRAYSCALE)
        cv2.imshow("img3", img)

    @staticmethod
    def im_write():
        img = cv2.imread('p1.jpg')
        height, width = img.shape[:2]  # a[:n] 代表列表中的第一项到第n项
        cv2.line(img, (0, 0), (width, height), (0, 0, 255), 2)
        cv2.imwrite('im_write.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 95])
        img = cv2.imread('im_write.jpg')
        cv2.namedWindow("img", cv2.WINDOW_NORMAL)
        cv2.imshow("img", img)

    @staticmethod
    def mutil_pic():
        img1 = cv2.imread('1.jpg')
        img2 = cv2.imread('2.jpg')
        img3 = cv2.imread('3.jpg')
        mutil_pic = np.hstack([img1, img2, img3])
        # mutil_pic = np.vstack([img1, img2, img3])
        cv2.imshow("mutil_pic", mutil_pic)

    @staticmethod
    def mouse_cb():
        def on_mouse_cb(event, x, y, flags, param):
            if event == cv2.EVENT_LBUTTONDOWN:
                cv2.circle(img, (x, y), 20, (255, 255, 255), -1)  # thickness: 线宽,-1表示填充

        cv2.namedWindow('img')
        cv2.setMouseCallback('img', on_mouse_cb)
        img = np.zeros((200, 200))
        while True:
            cv2.imshow('img', img)
            n = cv2.waitKey(5)
            if n == ord('q'):
                break
            elif n == ord('s'):
                cv2.imwrite("res.jpg", img)
                print("保存成功")

    def updateAlpha(self, x):
        self.alpha = x
        self.alpha = self.alpha * 0.01
        self.img_1 = np.uint8(np.clip((self.alpha * self.img_2 + self.beta), 0, 255))

    def updateBeta(self, x):
        self.beta = x
        # np.clip()是一个截取函数,用于截取数组中小于或者大于某值的部分,并使得被截取部分等于固定值
        self.img_1 = np.uint8(np.clip((self.alpha * self.img_2 + self.beta), 0, 255))

    def track_bar(self):
        self.img_1 = cv2.imread("test.jpg")
        self.img_2 = self.img_1.copy()
        cv2.namedWindow('image')
        cv2.createTrackbar('Alpha', 'image', 0, 300, self.updateAlpha)
        cv2.createTrackbar('Beta', 'image', 0, 255, self.updateBeta)
        cv2.setTrackbarPos('Alpha', 'image', 100)
        cv2.setTrackbarPos('Beta', 'image', 10)
        while True:
            cv2.imshow('image', self.img_1)
            if cv2.waitKey(10) == ord('q'):
                break

    @staticmethod
    def addWeighted():
        img1 = cv2.imread("img1.jpg", cv2.IMREAD_COLOR)
        if img1 is None:
            sys.exit("Could not read the img1.jpg.")
        img2 = cv2.imdecode(np.fromfile("山水.jpg", dtype=np.uint8), cv2.IMREAD_UNCHANGED)
        if img2 is None:
            sys.exit("Could not read the 山水.jpg.")
        alpha = beta = 0.5
        dst = cv2.addWeighted(img1, alpha, img2, beta, 0.0, None)
        cv2.imshow("dst", dst)
        MyCvUtil.set_win_title('dst', '图片混合')


if __name__ == '__main__':
    # CvSimpleDemo.hello_cv()
    # CvSimpleDemo.im_decode()
    # CvSimpleDemo.im_read_flags()
    CvSimpleDemo.im_write()
    # CvSimpleDemo.mutil_pic()
    # CvSimpleDemo.mouse_cb()
    # CvSimpleDemo.addWeighted()

    cvSimpleDemo = CvSimpleDemo()
    cvSimpleDemo.track_bar()

    cv2.waitKey(0)
    cv2.destroyAllWindows()

六、my_cv_util.py

import cv2
import numpy as np
import win32gui
import pyautogui
from PIL import ImageDraw, ImageFont, Image


class MyCvUtil(object):
    @staticmethod
    def set_win_title(win_cls_name: str, title: str):
        handle = win32gui.FindWindow(0, win_cls_name)
        if handle != 0:
            win32gui.SetWindowText(handle, title)

    @staticmethod
    def set_win_center(win_name: str, win_width: int, win_height: int):
        cv2.resizeWindow(win_name, win_width, win_height)
        screen_size = pyautogui.size()
        x = (screen_size.width - win_width) // 2
        y = (screen_size.height - win_height) // 2
        cv2.moveWindow(win_name, x, y)

    @staticmethod
    def show_img_win(a_img: np.ndarray, win_name: str):
        cv2.namedWindow(win_name, cv2.WINDOW_NORMAL)
        h, w = a_img.shape[:2]
        MyCvUtil.set_win_center(win_name, w, h)
        cv2.imshow(win_name, a_img)

    @staticmethod
    def draw_text(a_img: np.ndarray, info: str,
                  fontFace: int = cv2.FONT_HERSHEY_COMPLEX,
                  fontScale: int = 2, thickness: int = 2,
                  color=(255, 255, 255)):
        text_size = cv2.getTextSize(info, fontFace, fontScale, thickness)
        img_h, img_w = a_img.shape[:2]
        font_w, font_h = text_size[0]
        p_center = ((img_w - font_w) // 2, (img_h - font_h) // 2)
        cv2.putText(a_img, info, p_center, fontFace, fontScale, color=color, thickness=thickness)

    @staticmethod
    def draw_ch_text(a_img, text, position, textColor, textSize):
        if isinstance(a_img, np.ndarray):
            a_img = Image.fromarray(cv2.cvtColor(a_img, cv2.COLOR_BGR2RGB))
        draw = ImageDraw.Draw(a_img)
        fontStyle = ImageFont.truetype("msyh.ttc", textSize, encoding="utf-8")
        draw.text(position, text, textColor, font=fontStyle)
        return cv2.cvtColor(np.asarray(a_img), cv2.COLOR_RGB2BGR)

标签:img,python,win,self,cv2,opencv,np,def,图片
From: https://blog.csdn.net/SilentVoidCan/article/details/140874269

相关文章

  • Python 中的排序与 ASCII 编码解析
    1.引言    不知道你有没有想过用Python进行一些排序的工作,对于一些数量比较小的数字集合(例如:1、15、32、79、6、55)我们可以迅速发现最大的79和最小的1,但当这个数量非常大的时候,我们找大小就很费劲了,而这种繁琐的工作就应该派计算机出马了2.比大小  a.常规数字比......
  • Python使用Memcached示例
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • 2024年华为OD机试真题-欢乐的周末-Python-OD统一考试(C卷D卷)
    2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:小华和小为是很要好的朋友,他们约定周末一起吃饭。通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能到达的聚餐地点有多少个?输入描述......
  • Python并发编程
    简介多线程:threading,利用cpu和io可以同时执行的原理,让CPU不会等待IO完成多进程:multiprocess,利用多核CPU的能力,真正的并行执行任务异步IO:asynio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行 使用Lock对共享资源加锁,防止冲突访问使用Queue实现不......
  • 19.python之自定义函数
    python之自定义函数一、函数的介绍1、函数定义:函数是一个组织好,可重复使用,实现单一或联合的代码段。2、函数作用:a、降低代码的冗余、b、增加代码的复用性c、提高程序的拓展性d、封装二、python的结构三、函数的使用1、格式:def函数名(变量):执行语句函数名(实际参数)#调......
  • python装饰器提高代码复用,减少代码量,简洁易懂
    装饰器提高代码复用,减少代码量对于一个程序程序,无论是c、java、go还是python,组成这段程序的代码需要越简单越好,要知道程序的代码越简单,代码量越少,出错的概率就小,维护起来也简单。针对python语言,装饰器是我最近发现的针对简化代码,特别有帮助的工具。下面我用两段代码,演示一下同样......
  • python,怎么用工厂模式设计代码?
    工厂模式打造工厂模式,需要抽象工厂和具体工厂。怎么理解?抽象工厂就是接口的定义,但不负责具体的实现。而具体工厂则需要负责定义的接口的实现。就好比你爸爸让你上街时带一瓶酱油,而具体买什么牌子的由你决定。”你爸爸让带一瓶酱油“就是接口的定义函数,这个函数只负责定义”要求“......
  • python-深拷贝和浅拷贝
     浅拷贝list_name=["李琪",["周义杰","毛绍祺"]]data01=list_name[:]#触发浅拷贝:只复制第一层,共享深层数据data01[0]="琪琪"#修改第一层,数据2份,互不影响data01[1][0]="义杰"#修改深层,数据1份,数据互相影响print(list_name)print(data01) 深拷贝 作用:互不......
  • Python 循环引用与内存泄漏:深度解析
    Python循环引用与内存泄漏:深度解析在Python编程中,循环引用和内存泄漏是两个需要特别注意的问题。本文将深入探讨Python中的循环引用现象、其导致的内存泄漏问题,并提供详细的解决思路与方法。同时,我们还将分析一些常见场景,并分享扩展与高级技巧,帮助读者全面理解和应对这一......
  • GitHub点赞飙升!电信大牛的Python渗透测试实战指南
    在网络安全领域,会不会编程,是区分“脚本小子”和真正黑客的关键。实际的渗透测试中会遇到各种复杂的网络环境,常用工具不一定能满足需求,这时就需要对现有工具进行扩展,或者编写符合要求的工具、自动化脚本,这都需要一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制脚本......