1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/C_Li-PicDifferent

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
PicDiffer.md 11 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 12:36 17c79a5

Перевод текста на русский язык:

import picamera 
import time

# sudo pip3 install和pip3 install的路径不一样,所以pip3 isntall安装的包jupyter访问不到
import sys
sys.path.append('/home/pi/.local/lib/python3.5/site-packages') # 所以要加上这一句

import numpy as np
import matplotlib.pyplot as plt
import cv2
import matplotlib.cm as cm # 用于在特定颜色映射中显示图像

from skimage.measure import compare_ssim
import argparse
import imutils

Изображение

1. Съёмка изображения

# 树莓派500万像素的摄像头
# 全分辨率图像,主要是为了后期输出
img = np.empty((1920 * 2560 * 3,), dtype=np.uint8)
img2 = np.empty((1920 * 2560 * 3,), dtype=np.uint8)
with picamera.PiCamera() as camera:
    camera.resolution = (2560, 1920)
    camera.framerate = 10
    time.sleep(10)
    camera.capture(img, 'bgr')  # opencv用BGR
    img = img.reshape((1920, 2560, 3))
    
    time.sleep(5) # 5秒后拍摄第二张
    
    camera.capture(img2, 'bgr')  # opencv用BGB
    img2 = img2.reshape((1920, 2560, 3))
# Низкоразрешение изображения
img = np.empty((240 * 320 * 3,), dtype=np.uint8)
img2 = np.empty((240 * 320 * 3,), dtype=np.uint8)
with picamera.PiCamera() as camera:
    camera.resolution = (320, 240)
    camera.framerate = 10
    time.sleep(10)
    camera.capture(img, 'bgr')  # opencv用BGR
    img = img.reshape((240, 320, 3))
    
    time.sleep(5)
    
    camera.capture(img2, 'bgr')  # opencv用BGR
    img2 = img2.reshape((240, 320, 3))

2. Загрузка изображения из файла

img=cv2.imread('image.png')
img2=cv2.imread('image2.png')

Вывод изображения

# Вывод изображения
plt.figure(figsize=(10,5)) 
plt.subplot(1,2,1)
plt.imshow(img[...,::-1]) # 转RGB
plt.title('pic1')
plt.subplot(1,2,2)
plt.imshow(img2[...,::-1])
plt.title('pic2')
Text(0.5, 1.0, 'pic2')

png

# Сохранение изображения
cv2.imwrite('image.png', img)
cv2.imwrite('image2.png', img2)

Предварительная обработка изображения

# Масштабирование
image=cv2.resize(img, (320, 240), interpolation=cv2.INTER_CUBIC)
image2=cv2.resize(img2, (320, 240), interpolation=cv2.INTER_CUBIC)

# Перевод в оттенки серого
image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image2=cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)

# Гауссово размытие, может значительно уменьшить влияние шума
image = cv2.GaussianBlur(image, (5, 5), 0)
image2 = cv2.GaussianBlur(image2, (5, 5), 0)

Сравнение изображений

Метод 1: прямое сравнение разности значений для определения схожести изображений

В условиях яркого освещения и высокого контраста кажется не очень надёжным

# Вычисление абсолютной разности
image3=cv2.absdiff(image,image2)

# Бинаризация
image3 = cv2.threshold(image3, 25, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
    
print('Different pixels:',image3[image3=0].size,'of',image3.size)
diffRate=image3[image3=0].size/image3.size
print('DiffRate=',diffRate)

if diffRate>0.01:
    print('They are different.')
else:
    print('They are same.')
Different pixels: 4112 of 76800
DiffRate= 0.0535416666666667
They are different.
# Вывод сравнительного изображения
plt.figure(figsize=(14,6)) 
plt.subplot2grid((1,3),(0,0))
plt.imshow(image)
plt.title('pic1')
plt.subplot2grid((1,3),(0,1))
plt.imshow(image2)
plt.title('pic2')
plt.subplot2grid((1,3),(0,2))
plt.imshow(image3)
plt.title('diff')
Text(0.5, 1.0, 'diff')

png

Способ 2: использование структурной схожести (SSIM) для сравнения изображений

compare_ssim(X, Y, win_size=None, gradient=False, data_range=None, multichannel=False, gaussian_weights=False, full=False, **kwargs) сравнение SSIM (Structural SIMilarity) структурная схожесть

cv2.threshold (src, thresh, maxval, type) пороговое значение обработки

  • src: исходное изображение, должно быть одноканальным
  • thresh: пороговое значение, диапазон значений 0–255
  • maxval: цвет заполнения, диапазон значений 0–255
  • type: тип порога, см. таблицу ниже
    если после type добавить cv2.THRESH_OTSU, это означает автоматический выбор подходящего порога
Тип порога Пиксели меньше порога Пиксели больше порога
0 Установить 0 Установить цвет заливки
1 Установить цвет заливки Установить 0
2 Сохранить исходный цвет Установить серый цвет
3 Установить 0 Сохранить исходный цвет
4 Сохранить оригинальный цвет Установить 0

cv2.findContours(изображение, режим, метод[, контуры[, иерархия[, смещение ]]]) поиск контуров объекта

Обратите внимание, что функция findcontours будет «на месте» изменять входное изображение.

  • изображение: найти контуры изображения
  • режим: режим поиска контура
  • cv2.RETR_EXTERNAL указывает только на обнаружение внешнего контура
  • cv2.RETR_LIST обнаруженные контуры не устанавливают отношения уровня
  • cv2.RETR_CCOMP устанавливает два уровня контуров, верхний слой представляет собой внешний контур, внутренний слой представляет контур внутренней дыры. Если во внутренней дыре есть ещё один связанный объект, контур этого объекта также находится на верхнем уровне.
  • cv2.RETR_TREE устанавливает древовидную структуру контуров уровня Перевод текста на русский язык:

cv2.CHAIN_APPROX_SIMPLE сжимает элементы в горизонтальном, вертикальном и диагональном направлениях, сохраняя только конечные координаты точек в данном направлении. Например, для сохранения контура прямоугольника достаточно 4 точек.

  • cv2.CHAIN_APPROX_TC89_L1 и CV_CHAIN_APPROX_TC89_KCOS используют алгоритм аппроксимации цепочки Teh-Chinl.
  • Возвращаемое значение: контур и атрибуты каждого контура.

cv2.rectangle(изображение, левая верхняя координата, правая нижняя координата, цвет (BGR), ширина линии) рисует прямоугольник

cv2.putText(порог, текст, (10, 230), шрифт, 1, (255, 255, 255), 1)

изображение, текстовое содержимое, координаты, шрифт, размер, цвет, толщина шрифта

# вычисление ssim
(оценка, разница) = compare_ssim(изображение, изображение2, полный = True)
разница = (разница * 255).astype("uint8")
print("SSIM:{}".format(оценка))
SSIM:0.9140822389861617
plt.figure(figsize=(6,4)) 
plt.imshow(разница, cmap="gray")
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x6523fc70>

png

# найти контур
если оценка > 0,98:
    okText='Same'
    print(okText)
else:
    okText='Different'
    # бинаризация найти контуры разных точек
    порог = cv2.threshold(разница, 25, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

    # расширить пороговое изображение заполнить отверстия, затем найти контуры на пороговом изображении
    порог = cv2.dilate(порог, None, итерации=2)
    cnts = cv2.findContours(порог.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if imutils.is_cv2() else cnts[1]

    шрифт = cv2.FONT_HERSHEY_SIMPLEX
    imgzi = cv2.putText(порог, okText, (10, 230), шрифт, 1, (255, 255, 255), 1) # изображение, текстовое содержание, координаты, шрифт, размер, цвет, толщина шрифта
    
    plt.figure(figsize=(6,4)) 
    plt.imshow(imgzi)

png

# использовать прямоугольники для выделения разных точек
для c в cnts:
    (x, y, w, h) = cv2.boundingRect(c)
    cv2.rectangle(image2,(x,y),(x+w,y+h),(255,255,255),1)
image2 = cv2.putText(image2, okText, (10, 230), font, 1, (255, 255, 255), 1)
# вывод результатов
plt.figure(figsize=(10,5)) 
plt.subplot2grid((1,2),(0,0))
plt.imshow(изображение)
plt.title('pic1')
plt.subplot2grid((1,2),(0,1))
plt.imshow(image2)
plt.title('pic2')
Text(0.5, 1.0, 'pic2')

png

# вывести полное сравнение изображений
изображение=img
изображение2=img2

для c в cnts:
    (x,y,w,h) = cv2.boundingRect(c)
    x*=8
    y*=8
    w*=8
    h*=8
    cv2.rectangle(image2,(x,y),(x+w,y+h),(0,0,255),10)
    cv2.rectangle(изображение,(x,y),(x+w,y+h),(0,0,255),10)

# вывод результата
plt.figure(figsize=(10,5)) 
plt.subplot2grid((1,2),(0,0))
plt.imshow(изображение[...,::-1])
plt.title('pic1')
plt.subplot2grid((1,2),(0,1))
plt.imshow(изображение2[...,::-1])
plt.title('pic2')
Text(0.5, 1.0, 'pic2')

png

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/C_Li-PicDifferent.git
git@api.gitlife.ru:oschina-mirror/C_Li-PicDifferent.git
oschina-mirror
C_Li-PicDifferent
C_Li-PicDifferent
master