您的当前位置:首页正文

图像处理:numpy数组格式,opencv格式,PIL格式。是怎么回事?

2024-11-09 来源:个人技术集锦

让newbing帮我解决一下:

1.首先,PIL包的作用:

 opencv包的作用:

2.两者作用于不同的图片格式:

 3.opencv和PIL图像格式的相互转化

两者的相互转换需要借助numpy格式在中间,再进行转换。

其中cv2.cvtColor可以作用于numpy和opencv格式的图片,实现numpy和opencv的相互转换。cv2.cvtColo函数用于将图像从一种颜色空间转换为另一种颜色空间。

 

 np.array和np.asarray的区别:np.array会复制;而np.asarray与原始图像共享相同的数据缓冲区

 4.python中处理的图像格式

numpy数组——>opencv图像格式:

灰度图像:

 RGB图像:先用np.unit8函数

opencv图像格式——>numpy数组:

两种方法

numpy数组——>PIL图像格式:

灰度图像

 RGB图像:先用np.unit8函数

5.介绍几个opencv函数

cv2.inRange()

mask = cv2.inRange(hsv, thresh[0], thresh[1])   #cv2.inRange()函数是OpenCV中的函数,用于确认元素值是否介于某个区域。
    #hsv是原图,thresh[0]和thresh1是最小值和最大值,用于确定图像中的颜色范围。mask是输出的二进制图像,其中低于lowerb的值和高于upperb的值都变为0。

cv2.morphologyEx()函数,可以作用于numpy和opencv格式的图像

 

    close_kernel = np.ones((cls_kernel, cls_kernel), dtype=np.uint8)#全1矩阵
    image_close_img = Image.fromarray(cv2.morphologyEx(np.array(mask), cv2.MORPH_CLOSE, close_kernel))
    #np.array(mask)输入图像;close_kernel全1的核;cv2.MORPH_CLOSE闭运算用于排除小型空洞。并转换为PIL格式图像
    open_kernel = np.ones((open_kernal, open_kernal), dtype=np.uint8)
    image_open_np = cv2.morphologyEx(np.array(image_close_img), cv2.MORPH_OPEN, open_kernel)  #用于去除噪声,平滑较大物体的边界

    _, contours, _ = cv2.findContours(image_open_np, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  #在二值图像中找到轮廓,返回一个包含所有轮廓的列表
    #cv2.findContours函数的第一个参数是输入图像,第二个参数是轮廓检索模式,第三个参数是轮廓逼近方法。cv2.RETR_EXTERNAL表示只检测外部轮廓,cv2.CHAIN_APPROX_SIMPLE表示只保留轮廓的端点
    #变量contours将包含所有检测到的轮廓。这些轮廓可以用于计算图像中物体的面积、周长、重心等信息。

cv2.findContours()函数

 cv2.boundingRect()函数

    boundingBox = [cv2.boundingRect(c) for c in contours]    #cv2.boundingRect函数用于计算轮廓的边界框,返回一个包含边界框坐标和大小的元组。
    boundingBox = [sst for sst in boundingBox if sst[2] > 150 and sst[3] > 150]  #boundingBox列表将只包含宽度和高度大于150像素的边界框。
    #cv2.boundingRect函数会返回一个包含边界框坐标和大小的元组,其中前两个元素是矩形左上角的坐标,后两个元素是矩形的宽度和高度。因此,边界框是一个矩形,可以用来表示物体在图像中的位置和大小。
    #这段代码通常用于从图像中提取具有特定大小的物体。例如,在目标检测任务中,可以使用这段代码来过滤掉太小或太大的物体。
    print(boundingBox)
    print('boundingBox number ', len(boundingBox))  #输出边界框的个数

 cv2.drawContours()函数,再图像上绘制轮廓

   #这段代码的作用是在图像上绘制轮廓,并将绘制后的图像显示出来。isDrawContoursOnImages变量控制是否绘制轮廓。如果为True,则会在图像上绘制轮廓并显示出来。
    if isDrawContoursOnImages:
        line_color = (0, 0, 0)  # blue color code.(0,0,0)是黑色
        contours_rgb_image_np = np.array(subSlide)
        cv2.drawContours(contours_rgb_image_np, contours, -1, line_color, 50)
        #cv2.drawContours函数用于在图像上绘制轮廓,第一个参数是输入图像,第二个参数是轮廓列表,第三个参数是轮廓索引(-1表示绘制所有轮廓),第四个参数是线条颜色,第五个参数是线条宽度。
        contours_rgb_image_np = cv2.resize(contours_rgb_image_np, (0, 0), fx=0.2, fy=0.2)  #为了显示图像。所以缩小他
        countours_rgb_image_img = Image.fromarray(contours_rgb_image_np.astype(np.uint8))  #将contours_rgb_image_np缩小到原来的1/5,然后将其转换为PIL图像格式,这样就可以使用PIL库中的其他函数对图像进行处理
        #
        countours_rgb_image_img.show()   #PIL库中的一个函数,用于显示图像,原始图像加区域边框
Top