星海湾科技
OpenCV图像操作类
来源:网络 | 作者:佚名 | 发布时间: 2025-12-29 | 106 次浏览 | 分享到:

import numpy as np

import cv2 as cv

from matplotlib import pyplot as plt



class OpenCVOps:

    def __init__(self):

        pass


    def access_and_modify_pixel(self, image_path, pixel_x=100, pixel_y=100, new_pixel_value=[255, 255, 255]):

        """

        访问和修改图像的像素值。


        参数:

        image_path (str): 图像文件的路径。

        pixel_x (int): 要访问和修改的像素的x坐标,默认为100。

        pixel_y (int): 要访问和修改的像素的y坐标,默认为100。

        new_pixel_value (list): 新的像素值,格式为 [B, G, R],默认为 [255, 255, 255]。


        引用实例:

        opencv = OpenCVOps()

        opencv.access_and_modify_pixel('66.png', 150, 150, [0, 255, 0])

        """

        img = cv.imread(image_path)

        if img is not None:

            px = img[pixel_y, pixel_x]

            print(px)

            blue = img[pixel_y, pixel_x, 0]

            print(blue)

            img[pixel_y, pixel_x] = new_pixel_value

            print(img[pixel_y, pixel_x])

            self.show_and_destroy_image(img, 'pkq.png')

        else:

            print(f"无法加载图像: {image_path}")


    def get_image_properties(self, image_path):

        """

        获取图像的属性,如行数、列数、通道数、数据类型和像素数。


        参数:

        image_path (str): 图像文件的路径。


        引用实例:

        opencv = OpenCVOps()

        opencv.get_image_properties('66.png')

        """

        img = cv.imread(image_path)

        if img is not None:

            print(img.shape)

            print(img.size)

            print(img.dtype)

        else:

            print(f"无法加载图像: {image_path}")


    def roi_operation(self, image_path, roi_src=(280, 340, 330, 390), roi_dst=(273, 333, 100, 160)):

        """

        进行图像感兴趣区域(ROI)操作。


        参数:

        image_path (str): 图像文件的路径。

        roi_src (tuple): 源ROI区域,格式为 (y1, y2, x1, x2),默认为 (280, 340, 330, 390)。

        roi_dst (tuple): 目标ROI区域,格式为 (y1, y2, x1, x2),默认为 (273, 333, 100, 160)。


        引用实例:

        opencv = OpenCVOps()

        opencv.roi_operation('66.png', (200, 250, 200, 250), (100, 150, 100, 150))

        """

        img = cv.imread(image_path)

        if img is not None:

            y1_src, y2_src, x1_src, x2_src = roi_src

            y1_dst, y2_dst, x1_dst, x2_dst = roi_dst

            ball = img[y1_src:y2_src, x1_src:x2_src]

            img[y1_dst:y2_dst, x1_dst:x2_dst] = ball

            self.show_and_destroy_image(img, 'pkq.png')

        else:

            print(f"无法加载图像: {image_path}")


    def set_image_border(self, image_path, border_size=10, border_color=[255, 0, 0]):

        """

        为图像设置边框(填充)。


        参数:

        image_path (str): 图像文件的路径。

        border_size (int): 边框的大小,默认为10。

        border_color (list): 常量边框的颜色,格式为 [B, G, R],默认为 [255, 0, 0]。


        引用实例:

        opencv = OpenCVOps()

        opencv.set_image_border('66.png', 20, [0, 255, 0])

        """

        img1 = cv.imread(image_path)

        if img1 is not None:

            replicate = cv.copyMakeBorder(img1, border_size, border_size, border_size, border_size, cv.BORDER_REPLICATE)

            reflect = cv.copyMakeBorder(img1, border_size, border_size, border_size, border_size, cv.BORDER_REFLECT)

            reflect101 = cv.copyMakeBorder(img1, border_size, border_size, border_size, border_size, cv.BORDER_REFLECT_101)

            wrap = cv.copyMakeBorder(img1, border_size, border_size, border_size, border_size, cv.BORDER_WRAP)

            constant = cv.copyMakeBorder(img1, border_size, border_size, border_size, border_size, cv.BORDER_CONSTANT, value=border_color)


            plt.subplot(231), plt.imshow(img1, 'gray'), plt.title('ORIGINAL')

            plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')

            plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')

            plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')

            plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')

            plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')

            plt.show()

        else:

            print(f"无法加载图像: {image_path}")


    def image_blending(self, image_path1, image_path2, alpha=0.7, beta=0.3, gamma=0):

        """

        进行图像融合操作。


        参数:

        image_path1 (str): 第一张图像文件的路径。

        image_path2 (str): 第二张图像文件的路径。

        alpha (float): 第一张图像的权重,默认为0.7。

        beta (float): 第二张图像的权重,默认为0.3。

        gamma (float): 亮度调整值,默认为0。


        引用实例:

        opencv = OpenCVOps()

        opencv.image_blending('1.jpg', '0.jpg', 0.6, 0.4, 10)

        """

        img1 = cv.imread(image_path1)

        img2 = cv.imread(image_path2)

        if img1 is not None and img2 is not None:

            dst = cv.addWeighted(img1, alpha, img2, beta, gamma)

            self.show_and_destroy_image(dst, 'dst')

        else:

            print(f"无法加载图像: {image_path1} 或 {image_path2}")


    def bitwise_operation(self, image_path1, image_path2, threshold_value=10):

        """

        进行图像的按位运算操作。


        参数:

        image_path1 (str): 第一张图像文件的路径。

        image_path2 (str): 第二张图像文件的路径。

        threshold_value (int): 二值化阈值,默认为10。


        引用实例:

        opencv = OpenCVOps()

        opencv.bitwise_operation('1.jpg', '0.jpg', 20)

        """

        img1 = cv.imread(image_path1)

        img2 = cv.imread(image_path2)

        if img1 is not None and img2 is not None:

            rows, cols, channels = img2.shape

            roi = img1[0:rows, 0:cols]

            img2gray = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)

            ret, mask = cv.threshold(img2gray, threshold_value, 255, cv.THRESH_BINARY)

            mask_inv = cv.bitwise_not(mask)

            img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv)

            img2_fg = cv.bitwise_and(img2, img2, mask=mask)

            dst = cv.add(img1_bg, img2_fg)

            img1[0:rows, 0:cols] = dst

            self.show_and_destroy_image(img1,'res')

        else:

            print(f"无法加载图像: {image_path1} 或 {image_path2}")


    def performance_measurement(self, image_path, operation_func, *args, **kwargs):

        """

        衡量图像操作的性能。


        参数:

        image_path (str): 图像文件的路径。

        operation_func (function): 要执行的图像操作函数。

        *args: 传递给操作函数的位置参数。

        **kwargs: 传递给操作函数的关键字参数。


        引用实例:

        opencv = OpenCVOps()

        def sample_operation(image, param1):

            # 示例操作,比如简单的灰度转换

            return cv.cvtColor(image, cv.COLOR_BGR2GRAY)

        opencv.performance_measurement('66.png', sample_operation, param1=10)

        """

        img = cv.imread(image_path)

        if img is not None:

            e1 = cv.getTickCount()

            result = operation_func(img, *args, **kwargs)

            e2 = cv.getTickCount()

            time = (e2 - e1) / cv.getTickFrequency()

            print(f"操作耗时: {time} 秒")

            if result is not None:

                self.show_and_destroy_image(result, 'performance_result')

        else:

            print(f"无法加载图像: {image_path}")


    def show_and_destroy_image(self, img, window_name='draw'):

        """

        显示图像并等待按键,最后销毁窗口。


        参数:

        img (np.ndarray): 要显示的图像。

        window_name (str): 窗口的名称,默认为 'draw'。

        """

        cv.imshow(window_name, img)

        cv.waitKey(0)

        cv.destroyAllWindows()