computer-vision/opencv.ipynb

294 lines
352 KiB
Plaintext
Raw Normal View History

2019-12-08 03:13:45 +00:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Basic opencv\n",
"=================="
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fe48289dc90>"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import cv2\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"\n",
"img = cv2.imread('sheep.png')\n",
"\n",
"plt.imshow(img[:,:,::-1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"load images (matlab equiv)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"numpy.ndarray"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(img)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([74, 60, 48], dtype=uint8)"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"px = img[100, 100]\n",
"px"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fe48280f790>"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"img[100:300, 100:200] = [255, 0, 0]\n",
"img[:, :, 2] = 0\n",
"plt.imshow(img[:,:,::-1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"set pixels red"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(213, 320, 3)\n",
"uint8\n"
]
}
],
"source": [
"print(img.shape)\n",
"print(img.dtype)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([[0, 0, 0, ..., 0, 0, 0],\n",
" [0, 0, 0, ..., 0, 0, 0],\n",
" [0, 0, 0, ..., 0, 0, 0],\n",
" ...,\n",
" [0, 0, 0, ..., 0, 0, 0],\n",
" [0, 0, 0, ..., 0, 0, 0],\n",
" [0, 0, 0, ..., 0, 0, 0]], dtype=uint8),\n",
" array([[103, 103, 104, ..., 104, 103, 102],\n",
" [103, 102, 104, ..., 104, 105, 102],\n",
" [101, 101, 103, ..., 105, 103, 102],\n",
" ...,\n",
" [104, 102, 86, ..., 116, 87, 86],\n",
" [117, 90, 79, ..., 83, 71, 100],\n",
" [210, 97, 87, ..., 84, 108, 101]], dtype=uint8),\n",
" array([[ 53, 53, 53, ..., 49, 52, 49],\n",
" [ 51, 50, 52, ..., 46, 46, 45],\n",
" [ 50, 48, 52, ..., 49, 49, 47],\n",
" ...,\n",
" [ 51, 42, 19, ..., 57, 35, 35],\n",
" [ 77, 37, 19, ..., 30, 28, 43],\n",
" [173, 52, 26, ..., 27, 56, 46]], dtype=uint8))"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"b, g, r = cv2.split(img)\n",
"r, g, b"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"fairly expensive"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"img = cv2.merge((b, g, r))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"BLUE = [255, 0, 0]\n",
"constant = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=BLUE)"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[255]], dtype=uint8)"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = np.uint8([250])\n",
"y = np.uint8([10])\n",
"cv2.add(x, y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"use numpy integers"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"blended = cv2.addWeighted(img[0:200, 0:200], 0.8, img[0:200, 0:200], 0.2, 0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"grayscale = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}