让newbing帮我解决一下:
两者的相互转换需要借助numpy格式在中间,再进行转换。
其中cv2.cvtColor可以作用于numpy和opencv格式的图片,实现numpy和opencv的相互转换。cv2.cvtColo函数用于将图像从一种颜色空间转换为另一种颜色空间。
np.array和np.asarray的区别:np.array会复制;而np.asarray与原始图像共享相同的数据缓冲区
numpy数组——>opencv图像格式:
灰度图像:
RGB图像:先用np.unit8函数
opencv图像格式——>numpy数组:
两种方法
numpy数组——>PIL图像格式:
灰度图像
RGB图像:先用np.unit8函数
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库中的一个函数,用于显示图像,原始图像加区域边框