Opencv は、イメージを作成し、イメージのピクセル値を処理し、単一チャネルのイメージを生成し、tif イメージ メソッドを生成します。

後で確認できるように簡単なメモを作成しました。

1. 設定したサイズの画像を作成する

import numpy as np
"""h,w,c分别代表图像的高、宽和通道数"""
img = np.zeros((h,w,c),dtype = 'uint8')#全为0的图
img = np.zeros((h,w,c),dtype = 'uint8')#全为1的图
"""图像复制"""
img_x= img.copy()
"""查看图像尺寸等信息"""
img.shape
(img.shape[0],img.shape[1],img.shape[2])
img.size
"""通道分离,拆分通道 """
b, g, r = cv2.split(img)
"""合并通道""" 
m = cv2.merge([b, g, r]) 
cv2.imshow("Merge", m) 

2. 画像の画素値処理

"""像素值为0的像素个数"""
len(img[img == 0])
"""某个通道上"""
img[img[:,:,0] == 0]
img[img[:,:,1] == 0]
"""某个点上的像素值"""
xx = img[h1,w1,c1]#像素坐标+通道
"""该区域设置为白色 ,y表示行的范围,x表示列的范围"""
img[y1:y2, x1:x2]=[255,255,255] 
img[100:200, 150:250] = [255,255,255] 
"""修改像素 """
img[88,142] = [255, 255, 255] 
"""分别获取 BGR通道像素""" 
blue = img[88,142,0] 

3. 単一チャンネル画像として保存

import cv2
"""三通道bgr转单通道gray"""
img=cv2.imread('breast_img1.png',cv2.IMREAD_GRAYSCALE)
cv2.imwrite('one.png',img)
"""直接获取某通道数据进行保存"""
cv2.imwrite(save_path,img[:,:,0])

4. cv2.imwrite() と cv2.imread() について

"""cv.imread后加上-1即可,表示按照图片原有格式进行读取如果没有加上-1图片会被自动转换为三通道图片"""
实验验证过,我以png格式保存了(imwrite)单通道的图像,用imread()读取保存的图片发现变成三通道了
用法:
cv2.imread(jpgfile_path,-1)
这样读出来就跟保存时的一致了
retval = imread(filename[, flags]) 

retval = imread(filename[, flags]) filename は、ロードする画像のパス名を表します。これは、Windows ビットマップ、JPEG ファイル、PNG 画像、ポータブル ファイル形式、Sun ラスター ラスター ファイル、TIFF ファイル、HDR ファイルなどをサポートします。
Flags は読み込みフラグを表す int 型で、読み込み画像の色の種類を指定します、デフォルト値は 1 です。このうち、 cv2.IMREAD_UNCHANGED は、アルファ チャネルを含む完全なイメージの読み取りまたはイメージが不変であることを意味します。 cv2.IMREAD_GRAYSCALE は、グレースケール イメージの読み取りを意味します。 cv2.IMREAD_COLOR は、アルファを無視したデフォルト パラメーターのカラー イメージの読み取りを意味します。チャネル。

retval = imwrite(filename, img[, params]) 

filename は保存するパスとファイル名を表します

img は画像行列を表します

params は、特定の形式で保存されたパラメータのエンコーディングを表し、デフォルト値は空です。JPEG 画像の場合、このパラメータ (cv2.IMWRITE_JPEG_QUALITY) は画像の品質を 0 ~ 100 の整数で表し、デフォルト値は 95 です。PNG 画像の場合、このパラメータ (cv2.IMWRITE_PNG_COMPRESSION) は 0 ~ 9 の圧縮レベルを表します。圧縮レベルが高いほど、画像サイズは小さくなります。デフォルトのレベルは 3 です。PPM、PGM、PBM ピクチャの場合、このパラメータはバイナリ フォーマット フラグ (cv2.IMWRITE_PXM_BINARY) [2] を表します。型は Long であるため、int に変換する必要があることに注意してください。

5. シングルバンド tif イメージを生成します。

後で参照できるように練習の概要を示します。主な目的は、tif イメージを生成し、tif イメージ上に処理効果を表示することです。
主なアイデア:
①投影座標系、経度、緯度など、元の tif 画像の関連情報に基づいて新しい tif を作成します。 ②
cv メソッドは、ピクセル
③関数構成等に応じて生成したtif画像にcv画像の値を代入します。

import numpy as np
import os
import sys
from osgeo import gdal
import cv2

tif_out_path = './xxx/'
"""如果坐标系信息是继承自原有tif,假设通过一个读取函数gadl_info获取"""
img_width, img_height, img_nbands, img_proj,img_coord,dataset = gdal_info(image_file)
basename = os.path.basename(image_file)[:-4]#获取原图像的名称
tif_pre0 = np.zeros((img_height,img_width,3,dtype = 'uint8')
driver = gdal.GetDriverByName("GTiff")
tif_out_name = tif_out_path + basename + '.tif'
tif_pre = driver.Create(tif_out_name,img_width,img_height,1,gdal.GDT_Byte)
"""上面的“1”表示单波段,gdal.GDT_Byte是tif图像的8位像素深度"""
tif_pre.SetProjection(img_proj)
tif_pre.SetGeoTransform(img_coord)
"""上面两个是投影坐标系继承和坐标继承,左上角坐标值,如果不是继承,发生变化要重新计算"""
cv2.fillPoly(tif_pre0,[area1,area2],(255,255,255))
"""假如对某张cv图像进行区域的像素值填充操作,要把操作效果生成在tif图像上,如下"""
tif_pre.GetRasterBand(1).WriteArray(tif_pre0[:,:,-1])
del tif_pre

マルチバンド tif 画像が生成される場合、チャネル上で読み取られた値が順番に書き込まれます。

"""加入要生成tif波段数为n"""
tif_pre = driver.Create(tif_out_name,img_width,img_height,n,gdal.GDT_Byte)
tif_pre0 = np.zeros((img_height,img_width,3,dtype = 'uint8')
"""如果得到的数字矩阵维度是3,那么按通道写入,显然可以得到波段数n为3的tif图像"""
for i in range(3):
	tif_pre.GetRasterBand(i+1).WriteArray(tif_pre0[:,:,i])
del tif_pre

おすすめ

転載: blog.csdn.net/qq_44442727/article/details/127146404