遙感數據集制作(Potsdam數據集為例):TIF圖像轉JPG,TIF標簽轉PNG,圖像重疊裁剪

文章目錄

  • TIF圖像轉JPG
  • TIF標簽轉PNG
  • 圖像重疊裁剪
  • 圖像重命名
  • 數據集轉COCO格式
  • 數據集轉VOC格式

遙感圖像不同于一般的自然圖像,由于波段數量、圖像位深度等原因,TIF圖像數據不能使用簡單的格式轉換方法。本文以Potsdam數據集為例,制作能夠直接用于深度學習的數據集。
Potsdam數據集的內容如下:
在這里插入圖片描述
本文使用2_Ortho_RGB(圖像數據RGB通道順序)和5_Labels_all(標簽數據)作為示例進行數據集制作。
在這里插入圖片描述
在這里插入圖片描述

TIF圖像轉JPG

TIF轉JPG借鑒了文章怎么讀取tif格式的衛星遙感數據,并將數據輸入到神經網絡模型中進行訓練

# -*- coding: UTF-8 -*-
import numpy as np
import os
from PIL import Image
from osgeo import gdaldef readTif(imgPath, bandsOrder=[1, 2, 3]):"""讀取GEO tif影像的前三個波段值,并按照R.G.B順序存儲到形狀為【原長*原寬*3】的數組中:param imgPath: 圖像存儲全路徑:param bandsOrder: RGB對應的波段順序,如高分二號多光譜包含藍B,綠g,紅R,近紅Nir外四個波段,RGB對應的波段為3,2,1:return: R.G.B三維數組"""dataset = gdal.Open(imgPath, gdal.GA_ReadOnly)cols = dataset.RasterXSizerows = dataset.RasterYSizedata = np.empty([rows, cols, 3], dtype=float)for i in range(3):band = dataset.GetRasterBand(bandsOrder[i])oneband_data = band.ReadAsArray()data[:, :, i] = oneband_datareturn datadef stretchImg(imgPath, resultPath, lower_percent=0.5, higher_percent=99.5):"""#將光譜DN值映射至0-255,并保存:param imgPath: 需要轉換的tif影像路徑(***.tif):param resultPath: 轉換后的文件存儲路徑(***.jpg):param lower_percent: 低值拉伸比率:param higher_percent: 高值拉伸比率:return: 無返回參數,直接輸出圖片"""RGB_Array = readTif(imgPath)band_Num = RGB_Array.shape[2]JPG_Array = np.zeros_like(RGB_Array, dtype=np.uint8)for i in range(band_Num):minValue = 0maxValue = 255# 獲取數組RGB_Array某個百分比分位上的值low_value = np.percentile(RGB_Array[:, :, i], lower_percent)high_value = np.percentile(RGB_Array[:, :, i], higher_percent)temp_value = minValue + (RGB_Array[:, :, i] - low_value) * (maxValue - minValue) / (high_value - low_value)temp_value[temp_value < minValue] = minValuetemp_value[temp_value > maxValue] = maxValueJPG_Array[:, :, i] = temp_valueoutputImg = Image.fromarray(np.uint8(JPG_Array))outputImg.save(resultPath)def Batch_Convert_tif_to_jpg(imgdir, savedir):# 檢查保存目錄是否存在,如果不存在則創建if not os.path.exists(savedir):os.makedirs(savedir)# 獲取文件夾下所有tif文件名稱,并存入列表file_name_list = os.listdir(imgdir)for name in file_name_list:# 獲取圖片文件全路徑img_path = os.path.join(imgdir, name)# 獲取文件名,不包含擴展名filename = os.path.splitext(name)[0]savefilename = filename + ".jpg"# 文件存儲全路徑savepath = os.path.join(savedir, savefilename)stretchImg(img_path, savepath)print(f"Converted {filename} to jpg format.")print("Done!")# 主函數,首先調用
if __name__ == '__main__':imgdir = r"F:\Potsdam\2_Ortho_RGB"  # tif文件所在的【文件夾】savedir = r"F:\Potsdam\jpg"  # 轉為jpg后存儲的【文件夾】Batch_Convert_tif_to_jpg(imgdir, savedir)

在這里插入圖片描述

TIF標簽轉PNG

如果標簽圖像是單通道的,那么可以簡單地進行格式轉換以適應深度學習模型的輸入要求。然而,當標簽圖像以RGB格式存在時,則需要使用RGB字典進行映射。

import os
from PIL import Image
import numpy as npdef rgb_to_single_channel(rgb_image_path, output_path, rgb_dict):"""將RGB圖像轉換為單通道圖像,使用指定的RGB字典來映射類別標簽。:param rgb_image_path: RGB圖像的路徑:param output_path: 轉換后圖像的保存路徑:param rgb_dict: RGB字典,鍵是RGB元組,值是對應的類別標簽"""# 讀取RGB圖像rgb_image = Image.open(rgb_image_path)# 將圖像轉換為numpy數組rgb_array = np.array(rgb_image)# 創建一個空的單通道圖像數組single_channel_array = np.zeros((rgb_array.shape[0], rgb_array.shape[1]), dtype=np.uint8)# 將RGB值轉換為單一的標量值for rgb, label in rgb_dict.items():# 將圖像中的每個像素的RGB值與rgb_dict中的RGB元組進行比較# 如果匹配,則將對應的類別標簽賦給單通道圖像的對應像素single_channel_array[np.all(rgb_array == rgb, axis=-1)] = label# 將單通道數組轉換為圖像并保存single_channel_image = Image.fromarray(single_channel_array, mode='L')single_channel_image.save(output_path)def convert_tif_to_png(image_folder, output_folder, rgb_dict):"""將指定文件夾中的所有TIFF圖像轉換為PNG格式,并保存到另一個文件夾中。如果圖像是單通道圖像,則直接轉換為PNG。如果圖像是RGB圖像,則使用rgb_to_single_channel函數進行轉換。:param image_folder: 包含TIFF圖像的文件夾路徑。:param output_folder: 保存轉換后的PNG圖像的文件夾路徑。:param rgb_dict: RGB字典,用于rgb_to_single_channel函數。"""# 檢查輸出文件夾是否存在,如果不存在則創建它if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍歷圖像文件夾中的所有文件for filename in os.listdir(image_folder):filepath = os.path.join(image_folder, filename)# 檢查文件是否為TIFF格式if filename.endswith('.tif'):try:# 打開TIFF圖像image = Image.open(filepath)# 檢查圖像是否為單通道圖像if image.mode == 'L':# 如果是單通道圖像,直接轉換為PNGoutput_filename = os.path.splitext(filename)[0] + '.png'output_filepath = os.path.join(output_folder, output_filename)image.save(output_filepath, 'PNG')print(f"Converted {filename} to png format.")else:# 如果是RGB圖像,使用rgb_to_single_channel函數進行轉換output_filename = os.path.splitext(filename)[0] + '_single_channel.png'output_filepath = os.path.join(output_folder, output_filename)rgb_to_single_channel(filepath, output_filepath, rgb_dict)print(f"Converted {filename} to single channel png format.")except Exception as e:print(f"Error converting {filename}: {str(e)}")# 指定圖像文件夾和輸出文件夾
image_folder = r"F:\Potsdam\5_Labels_all"
output_folder = r"F:\Potsdam\png"# 定義RGB字典
rgb_dict = {(255, 255, 255): 1,  # 不透水路面 Impervious surfaces (RGB: 255, 255, 255)(0, 0, 255): 2,      # 建筑物 Building (RGB: 0, 0, 255)(0, 255, 255): 3,    # 低植被 Low vegetation (RGB: 0, 255, 255)(0, 255, 0): 4,      # 樹木 Tree (RGB: 0, 255, 0)(255, 255, 0): 5,    # 汽車 Car (RGB: 255, 255, 0)(255, 0, 0): 255       # 背景 Clutter/background (RGB: 255, 0, 0)
}# 調用函數進行轉換
convert_tif_to_png(image_folder, output_folder, rgb_dict)

在這里插入圖片描述

圖像重疊裁剪

由于遙感圖像數據集的珍貴性,我們可以使用重疊裁剪的方式擴充數據集數量,當然也可以設置為0不重疊。

import os
from PIL import Imagedef crop_images(image_path, save_path, subimage_size, overlap_ratio):"""將圖像裁剪成指定大小的子圖像,并允許設置子圖像之間的重疊比例。只有完全覆蓋原始圖像的子圖像才會被保存。:param image_path: 原始圖像路徑:param save_path: 保存子圖像的路徑:param subimage_size: 子圖像大小(寬度和高度):param overlap_ratio: 子圖像之間的重疊比例,范圍在0到1之間"""# 確保保存路徑存在os.makedirs(save_path, exist_ok=True)# 遍歷圖像路徑中的所有文件for filename in os.listdir(image_path):# 檢查文件是否為圖像格式if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tif')):# 打開圖像img = Image.open(os.path.join(image_path, filename))width, height = img.size# 計算子圖像的步長,包括重疊部分step = int(subimage_size * (1 - overlap_ratio))# 計算需要劃分的行列數num_rows = (height // step) + (1 if height % step > 0 else 0)num_cols = (width // step) + (1 if width % step > 0 else 0)# 遍歷并保存每個子圖片for row in range(num_rows):for col in range(num_cols):# 計算子圖像的左上角和右下角坐標left = col * steptop = row * stepright = left + subimage_sizebottom = top + subimage_size# 檢查子圖像是否完全覆蓋原始圖像if right <= width and bottom <= height:# 裁剪子圖像sub_img = img.crop((left, top, right, bottom))# 構建子圖像的文件名base_name, ext = os.path.splitext(filename)sub_filename = f"{base_name}_row{row}_col{col}{ext}"# 保存子圖像sub_img.save(os.path.join(save_path, sub_filename))print(f"{filename} cropping complete.")crop_images(r'F:\Potsdam\jpg',r'F:\Potsdam\jpg_512_0.5',512, 0.5)crop_images(r'F:\Potsdam\png',r'F:\Potsdam\png_512_0.5',512, 0.5)

在這里插入圖片描述

圖像重命名

在構建遙感圖像數據集的過程中,會遇到圖像集和相應的標簽集在文件命名上的不一致問題。這種不一致性會導致無法直接將數據集用于深度學習模型的訓練,因為模型通常需要圖像和標簽數據具有完全匹配的文件名,以確保它們可以正確地配對。

import osdef rename(directory, str):# 檢查目錄是否存在if not os.path.exists(directory):print("path error!")return# 獲取目錄下所有文件files = os.listdir(directory)# 循環處理每個文件for file in files:if file.endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tif')):# 檢查文件名中是否包含if str in file:# 構建新的文件名new_file_name = file.replace(str, '')# 舊文件路徑old_file_path = os.path.join(directory, file)# 新文件路徑new_file_path = os.path.join(directory, new_file_name)try:# 重命名文件os.rename(old_file_path, new_file_path)print(f" {file} rename {new_file_name}")except Exception as e:print(f" {file} error:{e}")# 指定路徑
jpg_directory_path = r"F:\Potsdam\jpg_512_0.5"
png_directory_path = r"F:\Potsdam\png_512_0.5"
jpg_str="_RGB"
png_str="_label_single_channel"# 執行重命名操作
rename(jpg_directory_path, jpg_str)
rename(png_directory_path, png_str)

在這里插入圖片描述
在這里插入圖片描述

數據集轉COCO格式

某些深度學習模型是根據公共自然圖像數據集格式進行數據集格式處理,這里給出COCO數據集的格式轉化。

import os
import json
import shutil
import random
from PIL import Image# 原始JPG圖片路徑
jpg_path = r'F:\Five-Billion-Pixels\jpg_512'
# 原始PNG標簽路徑
png_path = r'F:\Five-Billion-Pixels\png_24_512'
# COCO數據集路徑
coco_path = r'F:\Five-Billion-Pixels\coco-stuff'# 確保COCO數據集路徑存在
if not os.path.exists(coco_path):os.makedirs(coco_path)# 創建COCO數據集的目錄結構
annotations_path = os.path.join(coco_path, 'annotations')
images_path = os.path.join(coco_path, 'images')
train_images_path = os.path.join(images_path, 'train2017')
val_images_path = os.path.join(images_path, 'val2017')
train_annotations_path = os.path.join(annotations_path, 'train2017')
val_annotations_path = os.path.join(annotations_path, 'val2017')os.makedirs(annotations_path, exist_ok=True)
os.makedirs(images_path, exist_ok=True)
os.makedirs(train_images_path, exist_ok=True)
os.makedirs(val_images_path, exist_ok=True)
os.makedirs(train_annotations_path, exist_ok=True)
os.makedirs(val_annotations_path, exist_ok=True)# 獲取JPG圖片列表
jpg_images = [f for f in os.listdir(jpg_path) if f.lower().endswith('.jpg')]# 隨機劃分數據集
random.shuffle(jpg_images)
split_index = int(len(jpg_images) * 0.8)  # 80%的數據用于訓練,20%的數據用于驗證
train_images = jpg_images[:split_index]
val_images = jpg_images[split_index:]# 復制圖像和標簽到對應的目錄
def copy_images_and_labels(image_list, src_image_path, src_label_path, dst_image_path, dst_label_path):for image_name in image_list:# 復制圖像shutil.copy(os.path.join(src_image_path, image_name), os.path.join(dst_image_path, image_name))# 復制標簽label_name = image_name.replace('.jpg', '.png')shutil.copy(os.path.join(src_label_path, label_name), os.path.join(dst_label_path, label_name))# 復制訓練集圖像和標簽
copy_images_and_labels(train_images, jpg_path, png_path, train_images_path, train_annotations_path)# 復制驗證集圖像和標簽
copy_images_and_labels(val_images, jpg_path, png_path, val_images_path, val_annotations_path)

數據集轉VOC格式

某些深度學習模型是根據公共自然圖像數據集格式進行數據集格式處理,這里給出VOC數據集的格式轉化。

import os
import shutil
import randomdef create_voc_dataset(image_folder, label_folder):# 定義 VOC 數據集的主目錄和子目錄voc_root = 'VOCdevkit'voc_dataset = 'VOC2012'voc_images = os.path.join(voc_root, voc_dataset, 'JPEGImages')voc_labels = os.path.join(voc_root, voc_dataset, 'SegmentationClassAug')voc_image_sets = os.path.join(voc_root, voc_dataset, 'ImageSets', 'Segmentation')# 創建 VOC 數據集所需的目錄結構os.makedirs(voc_images, exist_ok=True)os.makedirs(voc_labels, exist_ok=True)os.makedirs(voc_image_sets, exist_ok=True)# 遍歷圖像文件夾中的所有圖像文件for root, dirs, files in os.walk(image_folder):for filename in files:if filename.endswith('.jpg'):# 構建圖像文件的完整路徑image_path = os.path.join(root, filename)# 構建 VOC 數據集中的圖像路徑voc_image_path = os.path.join(voc_images, filename)# 將圖像復制到 VOC 數據集目錄shutil.copy(image_path, voc_image_path)print('圖像已復制')# 遍歷標簽文件夾中的所有標簽文件for root, dirs, files in os.walk(label_folder):for filename in files:if filename.endswith('.png'):# 構建標簽文件的完整路徑label_path = os.path.join(root, filename)# 構建 VOC 數據集中的標簽路徑voc_label_path = os.path.join(voc_labels, filename)# 將標簽復制到 VOC 數據集目錄shutil.copy(label_path, voc_label_path)print('標簽已復制')# 獲取圖像文件夾中的所有文件名(不含擴展名)image_filenames = [os.path.splitext(filename)[0] for root, dirs, files in os.walk(image_folder) for filename in files if filename.endswith('.jpg')]# 隨機打亂文件名列表random.shuffle(image_filenames)# 計算訓練集和驗證集的分割點split_index = int(len(image_filenames) * 0.8)# 分割訓練集和驗證集train_files = image_filenames[:split_index]val_files = image_filenames[split_index:]# 生成 train.txt 文件train_file_path = os.path.join(voc_image_sets, 'train.txt')with open(train_file_path, 'w') as train_file:for filename in train_files:train_file.write(filename + '\n')# 生成 val.txt 文件val_file_path = os.path.join(voc_image_sets, 'val.txt')with open(val_file_path, 'w') as val_file:for filename in val_files:val_file.write(filename + '\n')# 打印成功提示信息print('train.txt 和 val.txt 已成功創建。')# 提供圖像文件夾和標簽文件夾的路徑
image_folder = r'F:\WHDLD\Images'
label_folder = r'F:\WHDLD\Labels'# 調用函數創建 VOC 數據集
create_voc_dataset(image_folder, label_folder)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13041.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13041.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux安裝配置CGAL,OpenCV和Gurobi記錄

安裝Qt&#xff0c;查看當前的Qt版本&#xff0c;需要至少滿足v5.12 qmake -v安裝CGAL&#xff0c;The Computational Geometry Algorithms Library (cgal.org) CGAL v5.6.1&#xff1a;https://github.com/CGAL/cgal/releases/download/v5.6.1/CGAL-5.6.1.tar.xz 確保C編譯…

每日復盤-20240515

僅用于記錄當天的市場情況&#xff0c;用于統計交易策略的適用情況&#xff0c;以便程序回測 短線核心&#xff1a;不參與任何級別的調整&#xff0c;采用龍空龍模式 一支股票 10%的時候可以操作&#xff0c; 90%的時間適合空倉等待 國聯證券 (1)|[9:25]|[133765萬]|31.12 一…

基于Pytorch深度學習神經網絡MNIST手寫數字識別系統源碼(帶界面和手寫畫板)

第一步&#xff1a;準備數據 mnist開源數據集 第二步&#xff1a;搭建模型 我們這里搭建了一個LeNet5網絡 參考代碼如下&#xff1a; import torch from torch import nnclass Reshape(nn.Module):def forward(self, x):return x.view(-1, 1, 28, 28)class LeNet5(nn.Modul…

【數據結構】C++語言實現二叉樹的介紹及堆的實現(詳細解讀)

c語言中的小小白-CSDN博客c語言中的小小白關注算法,c,c語言,貪心算法,鏈表,mysql,動態規劃,后端,線性回歸,數據結構,排序算法領域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 給大家分享一句我很喜歡我話&#xff1a; 知不足而奮進&#xff0c;望遠山而前行&am…

分布式系統的一致性與共識算法(三)

順序一致性(Sequential Consistency) ZooKeeper 一種說法是ZooKeeper是最終一致性&#xff0c;因為由于多副本、以及保證大多數成功的ZAB協議&#xff0c;當一個客戶端進程寫入一個新值&#xff0c;另外一個客戶端進程不能保證馬上就能讀到這個值&#xff0c;但是能保證最終能…

我的第一個網頁:武理天協

1. html代碼 1.1 首頁.html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>武理天協</title><link rel"stylesheet" href"./style.css"><link rel"stylesh…

【車載開發系列】SID$11服務配置

【車載開發系列】SID$11服務配置 前言 ECUReset(ECU重置),ECU作為Server端,執行Client發送來ECU Reset請求中重啟的類型(通過子服務區分)。對于UDS協議關于處理該請求的邏輯,沒有強制性定義。 Step1:SID和SubFunction的追加 BasicEditor→Dcm→DcmConfigSet→DcmDs…

vs2019 c++里用 typeid() . name () 與 typeid() . raw_name () 測試數據類型的區別

&#xff08;1&#xff09; 都知道&#xff0c;在 vs2019 里用 typeid 打印的類型不大準&#xff0c;會主動去掉一些修飾符&#xff0c; const 和引用 修飾符會被去掉。但也可以給咱們驗證學到的代碼知識提供一些參考。那么今天發現其還有 raw_name 成員函數&#xff0c;這個函…

AES分組密碼

一、AES明文和密鑰位數 RIJNDAEL 算法數據塊長度和密鑰長度都可獨立地選定為大于等于 128 位且小于等于 256 位的 32 位的任意倍數。 而美國頒布 AES 時卻規定數據塊的長度為 128 位、密鑰的長度可分別選擇為 128 位&#xff0c; 192 位或 256 位 1.1 狀態 中間結果叫做狀態…

建模:3dmax

3Dmax 制作模型和動畫&#xff08;橘肉&#xff09;&#xff1b; RizomUV 對模型進行展UV&#xff08;橘皮&#xff09;&#xff1b; Substance Painter 紋理手繪&#xff08;給橘皮制定想要的皮膚&#xff09;&#xff1b; 1.基礎 1.1可編輯多邊形、可編輯樣條線 體、面都需要…

Polylang Pro插件下載:多語言網站構建的終極解決方案

在全球化的今天&#xff0c;多語言網站已成為企業拓展國際市場的重要工具。然而&#xff0c;創建和管理一個多語言網站并非易事。幸運的是&#xff0c;Polylang Pro插件的出現&#xff0c;為WordPress用戶提供了一個強大的多語言解決方案。本文將深入探討Polylang Pro插件的功能…

linux上git 使用方法

一、git上新建倉庫 在git上新建倉庫&#xff0c;并命名 二、本地初始化 //命令行 ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" //ssh查看 cd /root/.ssh/ vim rsa.pub //復制后粘貼進git網頁設置里的ssh key //測試設置是否成功 ssh -T gitgithub.com/…

暴力數據結構之二叉樹(堆的相關知識)

1. 堆的基本了解 堆&#xff08;heap&#xff09;是計算機科學中一種特殊的數據結構&#xff0c;通常被視為一個完全二叉樹&#xff0c;并且可以用數組來存儲。堆的主要應用是在一組變化頻繁&#xff08;增刪查改的頻率較高&#xff09;的數據集中查找最值。堆分為大根堆和小根…

Spring事務的實現原理

Spring事務原理 Spring框架支持對于事務的管理功能&#xff0c;開發人員使用Spring框架能極大的簡化對于數據庫事務的管理操作&#xff0c;不必進行手動開啟事務&#xff0c;提交事務&#xff0c;回滾事務&#xff0c;就是在配置文件或者項目的啟動類配置Spring事務相關的注解…

什么是最大路徑?什么是極大路徑?

最近學習中&#xff0c;在這兩個概念上出現了混淆&#xff0c;導致了一些誤解&#xff0c;在此厘清。 最大路徑 在一個簡單圖G中&#xff0c;u、v之間的距離 d ( u , v ) min ? { u 到 v 的最短路的長度 } d(u,v) \min \{ u到v的最短路的長度 \} d(u,v)min{u到v的最短路的…

wefaf

c語言中的小小白-CSDN博客c語言中的小小白關注算法,c,c語言,貪心算法,鏈表,mysql,動態規劃,后端,線性回歸,數據結構,排序算法領域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 給大家分享一句我很喜歡我話&#xff1a; 知不足而奮進&#xff0c;望遠山而前行&am…

使用Bash腳本和Logrotate實現Nginx日志切割

Nginx是一個廣泛使用的高性能Web服務器&#xff0c;它能夠處理大量的并發連接&#xff0c;但同時也會生成大量的日志文件。為了有效管理這些日志文件并確保系統的正常運行&#xff0c;我們需要定期對Nginx的日志文件進行切割和歸檔。本文將介紹如何使用Bash腳本和Logrotate來實…

每天Get一個小技巧:用DolphinScheduler實現隔幾天調度

轉載自tuoluzhe8521 這篇小短文將教會你如何使用Apache DolphinScheduler實現隔幾天調度&#xff0c;有此需求的小伙伴學起來&#xff01; 1 場景分析 DolphinScheduler定時器模塊-定時調度時每3秒|每3分鐘|每3天這種定時&#xff0c;不能夠跨分鐘&#xff0c;跨小時&#x…

【C++】:string類的基本使用

目錄 引言一&#xff0c;string類對象的常見構造二&#xff0c;string類對象的容量操作三&#xff0c;string類對象的訪問及遍歷操作四&#xff0c;string類對象的修改操作五&#xff0c;string類非成員函數六&#xff0c;整形與字符串的轉換 引言 string 就是我們常說的"…

如何對SQL Server中的敏感數據進行加密解密?

為什么需要對敏感數據進行加密&#xff1f; 近幾年有不少關于個人數據泄露的新聞&#xff08;個人數據通常包含如姓名、地址、身份證號碼、財務信息等&#xff09;&#xff0c;給事發公司和被泄露人都帶來了不小的影響。 許多國家和地區都出臺了個人數據保護的法律法規&#…