Presidio的Image redactor模块主要负责扫描图片中的敏感信息,并通过重编辑的方法生成脱敏后的图片。
更多关于Presidio的信息可以阅读下面两篇文章:
Image redactor模块对图片文件进行脱敏操作流程如下图所示:
(1)使用OCR技术将图片中的文字转换成文本信息;
(2)使用Presidio的分析器对文本进行扫描,查看是否包含敏感信息;
(3)如果包含敏感信息,则定位敏感实体在图片中位置;
(4)对敏感信息实行脱敏处理;
(5)重编辑图片并生成脱敏后的图片;
Image redactor除了支持图片内容的脱敏操作,还支持DICOM图像的脱敏操作。
DICOM(Digital Imaging and Communications in Medicine)是医学数字成像和通信的国际标准,用于描述医学图像及其元数据的存储和传输方式 。DICOM格式可以存储来自多种医学成像模态的数据,包括CT、PET、MRI、X射线和超声波等,以创建诊断研究的完整描述 。DICOM文件不仅包含图像数据,还包括有关患者的受保护健康信息(PHI),例如姓名、性别、年龄,以及图像的设备信息和医疗上下文信息。
Image redactor模块对DICOM图像进行脱敏操作流程如下图所示:
(1)将DICOM类型文件转换成PNG类型文件;
(2)使用OCR技术定位图片中文本所在区域的像素位置;
(3)提取DICOM中metadata数据,此类数据包含大量敏感信息;
(4)使用分析器分析敏感数据,并定位到敏感数据在图像中的位置;
(5)复制原始的DICOM文件,并将敏感数据内容脱敏,重新保存为新的DICOM文件;
不管是普通图片文件还是DICOM文件都需要依赖于OCR技术扫描识别图片中文件,因此想要使用Image redactor模块的图像脱敏功能必须下载安装Tesseract OCR工具。
图片脱敏
下面两张图分别是脱敏前和脱敏后的图片:
图一:脱敏前
图二:脱敏后
下面是实现上面功能的代码:
from PIL import Image
from presidio_image_redactor import ImageRedactorEngine
# 使用pillow库打开图片文件
image = Image.open("./ocr_text.png")
# 创建Presidio的图片处理对象
engine = ImageRedactorEngine()
# 扫描文件内容,并对敏感数据内容进行重编辑(使用红色覆盖,参数是三原色值)
redacted_image = engine.redact(image, (255, 0, 0))
# 显示脱敏后的图片。
redacted_image.show()
# 保存脱敏后的图片
redacted_image.save("new_image.png")
DICOM图像脱敏
对于DICOM图像的脱敏操作更适用于医学领域上保护患者隐私方面。下面两张图片分别是脱敏前和脱敏后的DICOM图像:
图一:脱敏前
图二:脱敏后
下面是实现上面功能的代码:
import pydicom
import matplotlib.pyplot as plt
from presidio_image_redactor import DicomImageRedactorEngine
# 设置要进行脱敏处理的DICOM类型文件路径。
input_path = "./0_ORIGINAL.dcm"
# 创建Presidio的DICOM文件编译对象。
engine = DicomImageRedactorEngine()
# 读取DICOM文件。
dicom_image = pydicom.dcmread(input_path)
plt.imshow(dicom_image.pixel_array, cmap="gray")
plt.show()
# 扫描文件信息,对执行脱敏处理。
redacted_dicom_image = engine.redact(dicom_image, fill="contrast")
plt.imshow(redacted_dicom_image.pixel_array, cmap="gray")
plt.show()
自定义脱敏
上面介绍的不管图片脱敏还是DICOM图像脱敏都是使用的内置敏感信息识别器扫描的结果。当然,我们也可以根据实际场景自定义设置识别器,也可以设置白名单列表。
白名单
在图片脱敏章节已经展示了使用默认识别器脱敏前后的两张图片,下面我们将"David"和"(212) 555-1234"两个字符串设置为白名单,下面是执行脱敏后的结果,相较于图片脱敏章节中脱敏后的图片,"David"和"(212) 555-1234"两个字符串没有被遮盖掉。
实现代码:
from PIL import Image
from presidio_image_redactor import ImageRedactorEngine
# 使用pillow库打开图片文件
image = Image.open("./ocr_text.png")
# 创建Presidio的图片处理对象
engine = ImageRedactorEngine()
# 扫描文件内容,并对敏感数据内容进行重编辑(使用红色覆盖,参数是三原色值)。allow_list为白名单。
redacted_image = engine.redact(image, (255, 0, 0), allow_list=["David", "(212) 555-1234"])
# 显示脱敏后的图片。
redacted_image.show()
redacted_image.save("new_image.png")
自定义识别器
图像编辑引擎默认情况下总会加载内置的脱敏识别器对图片进行脱敏处理,如果我们不想加载内置识别器并且只想加载我们自己定义的识别器可以参考下面这段代码,我们自己定义一个识别器,识别图片中所有数字类型的文本并进行脱敏。
from PIL import Image
from presidio_image_redactor import ImageRedactorEngine, ImageAnalyzerEngine
from presidio_analyzer import Pattern, PatternRecognizer, AnalyzerEngine, RecognizerRegistry
numbers_pattern = Pattern(name="numbers_pattern", regex="\d+", score=0.5)
number_recognizer = PatternRecognizer(
supported_entity="NUMBER", patterns=[numbers_pattern]
)
registry = RecognizerRegistry()
registry.add_recognizer(number_recognizer)
analyzer = AnalyzerEngine(registry=registry)
# 使用pillow库打开图片文件
image = Image.open("./ocr_text.png")
image_engine = ImageAnalyzerEngine(analyzer_engine=analyzer)
# 创建Presidio的图片处理对象
engine = ImageRedactorEngine(image_engine)
# 扫描文件内容,并对敏感数据内容进行重编辑(使用红色覆盖,参数是三原色值)
redacted_image = engine.redact(image, (255, 0, 0), ad_hoc_recognizers=[number_recognizer])
# 显示脱敏后的图片。
redacted_image.show()
redacted_image.save("new_image.png")
脱敏后的图片如下图所示: