OpenCV, модуль Image вопросы и ответы по одиночному и три канала взаимного преобразования
I. Введение
Более недавний проект с фотографиями, иногда забывает изменить значение по умолчанию, так что чтение API стал полутоновым графиком трехканального, хотя после переналадки, но очень любопытной разницы между результатами первоначального чтения и позднего преобразованием. В руках-на многопроцессорных подбрасывать идеи, насосное хорошее время, чтобы немного поэкспериментировать со следующими результатами.
Во-вторых, тест
модуль 1.opencv
Там, где предыдущие коды, говорят результаты, следующим образом:
src_1 = cv2.imread(r"F:\demo\MS_DMS\add\0_\2.jpg", 0) # 正确读入单通道的方式
src_3 = cv2.imread(r"F:\demo\MS_DMS\add\0_\2.jpg") # 以三通道的方式读入
print(src_1)
gray = cv2.cvtColor(src_3, cv2.COLOR_BGR2GRAY) # 再将后者由三通道转换为单通道
list_ = ((gray == src_1).astype("int8")).tolist() # 转为列表,方便计算比对结果中 0(False) 的个数
print(list_.count(0))
результаты
src_1 =
[[148 149 150 ... 154 154 154]
[148 149 150 ... 154 154 154]
[148 150 151 ... 154 154 154]
...
[154 146 132 ... 213 195 154]
[144 135 130 ... 172 207 169]
[134 123 118 ... 210 180 199]]
list_.count(0) = 0 # 说明两个数组相等
Как видно из сказанного выше, оригинал считывается и нажмите трехканальный полутоновой фиг чтения, а затем преобразуется обратно в одноканальном варианте по фиг сравнению, результат равен двум. Посмотрите, как один канал в изменение трехканального.
src_1 = [[148 149 150 ... 154 154 154]
[148 149 150 ... 154 154 154]
[148 150 151 ... 154 154 154]
...
[154 146 132 ... 213 195 154]
[144 135 130 ... 172 207 169]
[134 123 118 ... 210 180 199]]
src_3 = [[[148 148 148]
[149 149 149]
[150 150 150]
...
[154 154 154]
[154 154 154]
[154 154 154]]
[[148 148 148]
[149 149 149]
[150 150 150]
...
[154 154 154]
[154 154 154]
[154 154 154]]
[[148 148 148]
[150 150 150]
[151 151 151]
...
[154 154 154]
[154 154 154]
[154 154 154]]
...
[[154 154 154]
[146 146 146]
[132 132 132]
...
[213 213 213]
[195 195 195]
[154 154 154]]
[[144 144 144]
[135 135 135]
[130 130 130]
...
[172 172 172]
[207 207 207]
[169 169 169]]
[[134 134 134]
[123 123 123]
[118 118 118]
...
[210 210 210]
[180 180 180]
[199 199 199]]]
src_3[0:1, 0:1, :] = [[[148 148 148]]] # 打印了三通道图的第一个像素点的数值看了一下
Длинные, примерно выглядеть на линии, чтобы программа просто скопировать один канал данных о том, что другие два канала данных с другой, это одна из первой точки пикселя я намеренно печататься значение можно увидеть. Как мы pytorch, форма массива (C, H, W), то есть то, что это?
# 特意将数组形状转换了一下,数值表现如下:
src_3_ = [[[148 148 148 ... 152 152 152]
[152 152 149 ... 151 152 152]
[152 152 152 ... 154 154 154]
...
[157 157 157 ... 157 157 157]
[150 150 150 ... 172 172 191]
[191 191 208 ... 151 158 158]]
[[158 161 161 ... 155 155 155]
[150 150 150 ... 203 203 213]
[213 213 173 ... 144 158 158]
...
[ 96 96 68 ... 134 151 151]
[151 129 129 ... 163 163 163]
[142 142 142 ... 84 84 74]]
[[ 74 74 94 ... 122 115 115]
[115 95 95 ... 164 164 164]
[140 140 140 ... 110 110 116]
...
[134 134 134 ... 163 163 163]
[163 163 163 ... 165 166 166]
[166 166 166 ... 199 199 199]]]
src_3_.shape = (3, 74, 76)
2.Image модуль
ptyorch в этом модуле больше, так и немного поэкспериментировать.
src = Image.open(r"F:\demo\MS_DMS\add\0_\2.jpg")
print(np.array(src))
Результаты:
[[[148 148 148]
[149 149 149]
[150 150 150]
...
[154 154 154]
[154 154 154]
[154 154 154]]
[[148 148 148]
[149 149 149]
[150 150 150]
...
[154 154 154]
[154 154 154]
[154 154 154]]
[[148 148 148]
[150 150 150]
[151 151 151]
...
[154 154 154]
[154 154 154]
[154 154 154]]
...
[[154 154 154]
[146 146 146]
[132 132 132]
...
[213 213 213]
[195 195 195]
[154 154 154]]
[[144 144 144]
[135 135 135]
[130 130 130]
...
[172 172 172]
[207 207 207]
[169 169 169]]
[[134 134 134]
[123 123 123]
[118 118 118]
...
[210 210 210]
[180 180 180]
[199 199 199]]]
Изображение открытой функции не предусмотрено в оттенках серого чтения (чтение документации функции не нашел ничего), а затем только в конце преобразовать его в одну карту канала, поэтому pytorch прочитать единое представление канала, когда вообще будет идти преобразовать его. Назад к результатам выше, это согласуется с результатами OpenCV, не верю, что вы можете сделать сравнение.
src2 = cv2.imread(r"F:\demo\MS_DMS\add\0_\2.jpg")
src = Image.open(r"F:\demo\MS_DMS\add\0_\2.jpg")
print(((src2 == np.array(src).astype("int8")).tolist()).count(0))
结果为 0 ,说明以不同API读取的两个数组结果是一样的。
Кроме того, изображение является единственным каналом в данные трехканального непосредственно на канале , а затем две копии, так что те же данные из трех каналов.
Попробуйте следующие результаты одного канала.
src2 = cv2.imread(r"F:\demo\MS_DMS\add\0_\2.jpg", 0) # opencv按单通道读取图片
src = Image.open(r"F:\demo\MS_DMS\add\0_\2.jpg").convert("L") # Image将三通道转为单通道
print("src = ",np.array(src))
print(((src2 == np.array(src).astype("int8")).tolist()).count(0)) # 比对二者是否一样
结果为:
src = [[148 149 150 ... 154 154 154]
[148 149 150 ... 154 154 154]
[148 150 151 ... 154 154 154]
...
[154 146 132 ... 213 195 154]
[144 135 130 ... 172 207 169]
[134 123 118 ... 210 180 199]]
((src2 == np.array(src).astype("int8")).tolist()).count(0) = 0 # 为 0 表示上面两个数组是相等的
В-третьих, резюме
После этого испытания, и , наконец, решение сомнений в моем уме, чтобы подвести итог:
① OpenCV по результатам одного канала чтения фотографии и прочитать пресс - изображение , а затем преобразуется в три канала одноканальные и последовательные результаты обоих;
② изображение только по три канала чтения изображения, OpenCV в соответствии с результатами трехканального образом читает. После преобразования в один канал, то результат также согласуется с OpenCV.
И есть другие возможные сомнения, проверить его снова медленно. Удобный ~ ~