предисловие
В этой статье используется пакет python, фактически выпущенный автором.imgkernel
Например. Таким образом, все появления в этой статьеimgkernel
место, замените его именем собственного проекта или пакета читателя. в то же время,imgkernel
Также размещен на github, основная ветка будет обновлена позже, но проект проверяется отдельно.pkg
Ветка останется в соответствии с содержанием этой статьи и не будет изменена. Поэтому эту ветвь можноclone
Вниз как новый проект, чтобы начать проект. клонpkg
Путь к разветвлению следующий:
git clone -b pkg https://github.com/kenblikylee/imgkernel.git
Шаг за шагом нижеimgkernel
Создание проекта, генерация, тестирование выпуска, официальный выпуск в PyPi, установка и использование.
1. Создайте репозиторий на гитхабе
2. Клонируйте репозиторий локально
git clone https://github.com/kenblikylee/imgkernel.git
cd imgkernel
3. Создайте setup.py
setup.py — это сценарий сборки setuptools, который сообщает setuptools имя и версию пакета, а также файлы, которые будут упакованы.
Создайте новый файл setup.py в корневом каталоге проекта, скопируйте и вставьте следующий код в setup.py:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="imgkernel",
version="0.0.1",
author="ken",
author_email="kenbliky@gmail.com",
description="Image kernel.",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/kenblikylee/imgkernel",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
)
4. Создайте пакет проекта imgkernel
setup.py автоматически найдет подкаталог корневого каталога проекта, который содержит файл __init__.py в качестве пакета проекта, и использует имя каталога в качестве имени пакета. Здесь создается только пакет с тем же именем, что и у проектаimgkernel
, конечно, не обязательно создавать пакет с одним и тем же именем, на самом деле можно создать несколько пакетов с любым именем.
После создания вся структура каталогов проекта выглядит следующим образом:
.
├── imgkernel
│ ├── __init__.py
│ ├── imgconv.py
│ └── kernels.py
├── LICENSE
├── README.md
└── setup.py
Пакет imgkernel состоит из трех файлов:__init__.py
, imgconv.py
, kernels.py
, ниже приведены реализации кода трех файлов:
4.1 __init__.py
__init__.py — внешний интерфейс экспорта внутреннего модуля пакета, или, при использованииimport
импортировать объект в то время. В этот файл мы помещаем функции, данные, классы и т. д., которые должны быть предоставлены внешними приложениями. Конечно, это не обязательно должно быть реализовано в этом файле,import
Входящие модули также экспортируются, например, следующиеkernels
все ядра под иimgconv
функция.
from .kernels import *
from .imgconv import imgconv
def identity(imgpath, gray=True, **argkw):
return imgconv(imgpath, identity_kernel(**argkw), strides=1, mean=False, gray=gray)
def sharpen(imgpath, gray=True, **argkw):
return imgconv(imgpath, sharpen_kernel(**argkw), strides=1, mean=False, gray=gray)
def blur(imgpath, gray=True, **argkw):
return imgconv(imgpath, blur_kernel(**argkw), strides=1, mean=False, gray=gray)
def emboss(imgpath, gray=True, **argkw):
return imgconv(imgpath, emboss_kernel(**argkw), strides=1, mean=False, gray=gray)
def outline(imgpath, gray=True, **argkw):
return imgconv(imgpath, outline_kernel(**argkw), strides=1, mean=True, gray=gray)
def sobel(imgpath, gray=True, **argkw):
return imgconv(imgpath, sobel_kernel(**argkw), strides=1, mean=False, gray=gray)
4.2 imgconv.py
from PIL import Image
import numpy as np
def read_img(imgpath, gray=True):
img = Image.open(imgpath)
if gray:
img = img.convert("L")
return img
def crop_center(img):
w, h = img.size
c_x, c_y = w/2, h/2
offset = min(w, h) / 2
crop_box = (c_x-offset, c_y-offset, c_x+offset, c_y+offset)
return img.crop(crop_box)
def resize_width(img, width):
w, h = img.size
height = int(width * h / w)
return img.resize((width, height))
def apply_img_kernel(img, kernel, strides=1, mean=False):
img = np.asarray(img)
h, w = img.shape[:2]
k_h, k_w = kernel.shape[:2]
x_range = range(0, w - k_w + 1, strides)
y_range = range(0, h - k_h + 1, strides)
if mean:
prosum = lambda a,b: min((a*b).mean(), 255)
else:
prosum = lambda a,b: min((a*b).sum(), 255)
cal = lambda img: np.array([[prosum(img[i:i+k_h, j:j+k_w], kernel)
for j in x_range]
for i in y_range]).astype(np.uint8)
if len(img.shape) == 2:
data = cal(img)
return Image.fromarray(data)
elif len(img.shape) == 3:
r, g, b = np.transpose(img, (2, 0, 1))
_r, _g, _b = cal(r), cal(g), cal(b)
return Image.merge('RGB', [Image.fromarray(d) for d in [_r, _g, _b]])
imgs = dict()
def imgconv(imgpath, kernel, strides=1, mean=False, gray=True):
if imgpath in imgs:
img = imgs[imgpath]
else:
img = read_img(imgpath, gray)
img = crop_center(resize_width(img, 320))
return img, apply_img_kernel(img, kernel, mean=mean)
4.3 kernels.py
import numpy as np
# 鲜明
def identity_kernel(iden=1.0):
return np.array([[0, 0, 0],
[0, iden, 0],
[0, 0, 0]])
# 锐化
def sharpen_kernel(inner=5.0, edge=-1.0):
return np.array([[0, edge, 0],
[edge, inner, edge],
[0, edge, 0]])
# 模糊
def blur_kernel(inner=0.25, edge=0.125, corner=0.0625):
return np.array([[corner, edge, corner],
[edge, inner, edge],
[corner, edge, corner]])
# 浮雕
def emboss_kernel(diag=2.0, iden=1.0):
return np.array([[-diag, -iden, 0],
[-iden, iden, iden],
[0, iden, diag]])
# 轮廓线
def outline_kernel(inner=8.0, outer=-1.0):
return np.array([[outer, outer, outer],
[outer, inner, outer],
[outer, outer, outer]])
# 边缘检测
def sobel_kernel(direction, base=None, edge=2.0, corner=1.0):
if base is not None:
edge = base
corner = base / 2
if direction == 'top':
return np.array([[corner, edge, corner], [0, 0, 0], [-corner, -edge, -corner]])
elif direction == 'bottom':
return np.array([[-corner, -edge, -corner], [0, 0, 0], [corner, edge, corner]])
elif direction == 'left':
return np.array([[corner, 0, -corner], [edge, 0, -edge], [corner, 0, -corner]])
elif direction == 'right':
return np.array([[-corner, 0, corner], [-edge, 0, edge], [-corner, 0, corner]])
return identity_kernel()
5. Соберите пакет
Убедитесь, что у вас установлена последняя версия setuptools,wheel,tine
pip install --user --upgrade setuptools wheel twine
Сгенерировать пакет проекта:
python setup.py sdist bdist_wheel
После запуска структура каталогов проекта выглядит следующим образом:
.
├── build
│ ├── bdist.macosx-10.7-x86_64
│ └── lib
│ └── imgkernel
│ ├── __init__.py
│ ├── imgconv.py
│ └── kernels.py
├── dist
│ ├── imgkernel-0.0.1-py3-none-any.whl
│ └── imgkernel-0.0.1.tar.gz
├── imgkernel
│ ├── __init__.py
│ ├── imgconv.py
│ └── kernels.py
├── imgkernel.egg-info
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ ├── dependency_links.txt
│ └── top_level.txt
├── LICENSE
├── README.md
└── setup.py
6. Загрузите пакет в PyPI.
6.1 Регистрация тестовой учетной записи PyPI
Зарегестрированный адрес:test.leatherpi.org/account/reg…
6.2 Используйте шпагат для загрузки архива в каталог dist
python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
Открытым:test.leatherpi.org/project/IMG…Как видите, пакет успешно опубликован для тестирования PyPI.
7. Установка
pip install --index-url https://test.pypi.org/simple/ --no-deps imgkernel
Используйте интерпретатор Python, чтобы проверить, успешно ли был установлен пакет:
$ python
>>> import imgkernel
>>> imgkernel.blur
<function blur at 0x108c00d90>
>>> imgkernel.outline
<function outline at 0x108c00ea0>
8. Пытаюсь выпустить!
Если в подразделе 6 речь идет о публикации в тестовой среде PyPI, то этот шаг — о публикации в рабочей среде PyPI. Если вышеуказанные шаги успешно выполнены, выпуск в основном аналогичен попытке PyPI. Следует отметить, что тестовый PyPI не хранится постоянно, и фон будет регулярно очищаться, в то время как тестовый PyPI хранится постоянно, и после выпуска его нельзя изменить, можно повторять только новые версии. Также необходимо следить за тем, чтобы имя пакета не могло быть уже выпущенным пакетом с таким же именем.
Положительный тест и тест являются независимыми системами, поэтому также необходимо зарегистрировать аккаунт, адрес регистрации:pypi.org
Опубликовать шпагатом:
python -m twine upload dist/*
Установить:
pip install imgkernel
Эпилог
Адрес github этого примера проекта:GitHub.com/Ken Ratio в порядке...
Инструкции:
git clone -b pkg https://github.com/kenblikylee/imgkernel.git
связанное предложение
Как добавить бесплатную онлайн-документацию в ваш проект Python?
Ссылаться на
Отсканируйте QR-код в WeChat, чтобы получить оригиналы новейших технологий