求图像中指定颜色区域的相对面积问题

一、问题描述

下图为一张医学图像,图中的阴影面积为坏死需要切除的脑组织,其中黑色的圆圈为AI所画,红色的圆圈为临床医生所画,现在需要计算阴影面积大小。
医学图像

二、解决思路

思路一:由图可见,两个圆圈均为椭圆,考虑在图像上建立直角坐标系,然后确定两个椭圆方程,再用微积分知识求得两圆重叠部分面积大小。此种方法基本上属于纯数学计算,计算量巨大,计算到一半实在算不下去了,就放弃了。
思路二:图像处理的问题直接对像素点进行处理,首先读取该图像所有的像素点个数,然后读取图像每个像素点的RGB值,并将该GRB转换为灰度值,最后根据像素点的灰度值计算出阴影部分相对面积。此种方法的局限性在于圈外有颜色比较深的像素点和圈内有比较浅的像素点都会影响计算结果的准确度。

三、解决方法

下面介绍一下具体的思路二的解决方案,该方法是对当个像素点进行比较底层的计算操作,因此不适用像素高的图像。
3.1 导入需要的模块

from PIL import Image
import cv2
import csv

3.2 获取图像所有像素点个数信息

image=cv2.imread('7864d35aaa1262bbca983a4765f1af6.jpg')
a = image.shape
print('图像像素高度为:{},图像像素宽度为:{},图像通道数为:{}'.format(a[0],a[1],a[2]))
all_pixel_points = a[0]*a[1]
print('图像总的像素点有:{}个'.format(all_pixel_points))

3.3 遍历图像中所有像素点X坐标值、Y坐标值以及响应坐标的RGB值,并写入all_Pixel points.csv中

header = [' x坐标',' y坐标',' R',' G',' B']

with open("all_Pixel points.csv",'w+',encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(header)
    im = Image.open('7864d35aaa1262bbca983a4765f1af6.jpg')
    rgb_im = im.convert('RGB')
    count = 0

    #遍历所有像素点并记录RGB的值
    for i in range(a[1]):
        for j in range(a[0]):
            r, g, b = rgb_im.getpixel(( i, j))
            Gray = (r*30 + g*59 + b*11)/100
            R = Gray
            G = Gray
            B = Gray
            print( i, j, R, G, B, file=f)

            if Gray <= 80:
                count += 1

看下输出的.csv文件
在这里插入图片描述
3.4 结果输出

print('灰度值低于80的像素点有:{}'.format(count))
print('灰度值低于80的像素点占总像素点比例为:{}'.format((count)/all_pixel_points))
print('阴影部分相对面积为:{}%'.format("%.3f"%((count)*100/all_pixel_points)))

看下最后的运行结果
在这里插入图片描述

四、总结

这种方法决绝上述问题有一定的误差,在临床医疗上不一定能接受,要减小误差,除了对算法进一步改进外,在图像的预处理过程中还有更多的操作空间。另外,也可以先把两个圆单独复现到白板上进行操作,能降低圆圈外部颜色较深的像素点的对结果的影响,当然这也算图像预处理的一种。

五、附录

完整代码

from PIL import Image
import cv2
import csv

#获取图像所有像素点的个数
image=cv2.imread('7864d35aaa1262bbca983a4765f1af6.jpg')
a = image.shape
print('图像像素高度为:{},图像像素宽度为:{},图像通道数为:{}'.format(a[0],a[1],a[2]))
all_pixel_points = a[0]*a[1]
print('图像总的像素点有:{}个'.format(all_pixel_points))

header = [' x坐标',' y坐标',' R',' G',' B']

with open("all_Pixel points.csv",'w+',encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(header)
    im = Image.open('7864d35aaa1262bbca983a4765f1af6.jpg')
    rgb_im = im.convert('RGB')
    count = 0

    #遍历所有像素点并记录RGB的值
    for i in range(a[1]):
        for j in range(a[0]):
            r, g, b = rgb_im.getpixel(( i, j))
            Gray = (r*30 + g*59 + b*11)/100
            R = Gray
            G = Gray
            B = Gray
            print( i, j, R, G, B, file=f)

            if Gray <= 80:
                count += 1

print('灰度值低于80的像素点有:{}'.format(count))
print('灰度值低于80的像素点占总像素点比例为:{}'.format((count)/all_pixel_points))
print('阴影部分相对面积为:{}%'.format("%.3f"%((count)*100/all_pixel_points)))

更多思路方法欢迎评论区交流

  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
OpenCV是一个广泛使用的计算机视觉库,在图像处理计算机视觉领域具有重要的应用。如果你想要使用OpenCV来识别指定颜色区域,可以按照以下步骤进行操作。 首先,你需要加载一张图像。可以使用OpenCV的`imread()`函数将图像加载为一个Mat对象。接下来,你需要将加载的图像转换为HSV颜色空间,因为在HSV颜色空间颜色信息更容易表示和处理。可以使用OpenCV的`cvtColor()`函数将图像从BGR颜色空间转换为HSV颜色空间。 接下来,你需要定义要识别的颜色范围。在HSV颜色空间,每个颜色都有对应的色调(H),饱和度(S)和亮度(V)值。你可以通过试验的方式找到你感兴趣的颜色的HSV值范围。例如,如果你想识别红色,你可以定义一个HSV范围,例如:[0, 120, 70]到 [10, 255, 255],这样就可以包括红色的不同亮度和饱和度。 然后,你可以使用OpenCV的`inRange()`函数将图像符合指定颜色范围的像素筛选出来,生成一个二值图像。这个函数会将符合指定颜色范围的像素设置为白色,其他像素设置为黑色。 最后,你可以使用OpenCV的`findContours()`函数来找到二值图像的轮廓。根据你的需,你可以选择对找到的轮廓进行进一步的处理和分析,例如计算轮廓面积、周长、心点等等。 总结来说,使用OpenCV识别指定颜色区域的步骤包括加载图像、转换颜色空间、定义颜色范围、筛选符合颜色范围的像素,最后找到轮廓。通过这些步骤,你可以使用OpenCV实现对指定颜色区域的识别。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

放点花椒~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值