Links:

Shortpath Codes

Remove Background Color

# Usage: ipython --pdb removeColor.py 18
#! /usr/bin/env python
import itertools as it
import collections as ct
import cv2 as cv
import numpy as np
import pandas as pd def calculate_top_color(image):
a = image.copy()
cnt = ct.Counter(a)
topTen = cnt.most_common(10)
topTenColors=[k for k,v in topTen]
topColor=np.array(topTenColors).mean()
return topColor def replace_color(image, top=None, threshold=5, color=255):
color_threshold = threshold
a = image.copy()
s = pd.Series(image.flatten())
rows, cols = image.shape
topColor0 = top or calculate_top_color(s)
topColor = top or int(s.describe()['50%'])
colorMin = topColor - color_threshold
colorMax = topColor + color_threshold
print(s.describe(), '\n', "TopColor: %s, %s\n" % (topColor, topColor0))
for r in range(rows):
for c in range(cols):
val = a.item(r, c)
if colorMin <= val < colorMax:
a.itemset((r, c), color)
return a def remove_top_color(img, top=None, threshold=18, color=255):
b, g, r =img[:, :, 0], img[:, :, 1], img[:, :, 2]
print("\nProcessing Color Channel: BLUE")
b = replace_color(b, top, threshold, color) print("\nProcessing Color Channel: GREEN")
g = replace_color(g, top, threshold, color) print("\nProcessing Color Channel: RED")
r = replace_color(r, top, threshold, color)
img0 = cv.merge((b, g, r))
return img0 if __name__ == "__main__":
import os,sys
threshold = int(sys.argv[1]) if len(sys.argv) > 1 else 18
# Load the image first
img_path = './Signature.jpg'
img0 = cv.imread(img_path)
assert img0 is not None, "file could not be read, check with os.path.exists('%s')" % img_path cv.imwrite('Original.jpg', img0)
img1 = remove_top_color(img0, threshold=threshold)
cv.imwrite('Output.jpg', img1)
import itertools as it
import collections as ct
import cv2 as cv
import numpy as np
import pandas as pd # Load the image first
img_path = './Signature.jpg'
img = cv.imread(img_path)
assert img is not None, "file could not be read, check with os.path.exists('%s')" % img_path # Color Channels Splitting and merging
b, g, r =img[:, :, 0], img[:, :, 1], img[:, :, 2] # faster than cv.split(img)
a = b.flatten()
# Save the original image
img0 = cv.merge((b, g, r))
cv.imwrite('Original.jpg', img0) # Using Python's collections.Counter()
import collections as ct
topTen = ct.Counter(a).most_common(10) # Using Pandas for Number Analysis and Statistics
ss, df = pd.Series(a), pd.DataFrame(b) # Pandas Descriptive statistics Summarizing data: describe
ss.describe() # Pandas: **select specific percentiles**:
# By default, the median is always included
percentiles = [0.05, 0.25, 0.75, 0.95]
ss.describe(percentiles=percentiles) # Graystyle
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # bgSubtractor for background removal
bgSuber = cv.bgsegm.createBackgroundSubtractorMOG()
bgSuber.apply(img)
bgSuber_img = bgSuber.apply(img)
cv.imwrite('bgSuber.jpg', bgSuber_img)
# Perform morphology operation
morph_kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))
mask = cv.morphologyEx(bgSuber_img, cv.MORPH_CLOSE, morph_kernel)
res = cv.bitwise_and(img, img, mask=mask)
cv.imwrite('Result.jpg', res)

Accessing Image Properties

  • Image properties include "number of rows, columns, and channels"; "type of image data"; "number of pixels"; etc.
  • Note:
    • it is a good method to check whether the loaded image is grayscale or color.
    • img.dtype is very important while debugging,

      because a large number of errors in OpenCV-Python code are caused by invalid datatype.
#1. **Total number of pixels** is accessed by `img.size`:
#2. **Image datatype** is obtained by `img.dtype`:
#3. **shape of an image** is accessed by `img.shape`, It returns
# a tuple of the number of rows, columns, and channels(if the image is color)
# a tuple of the number of rows and columns ONLY**if an image is grayscale**.
# **check whether the loaded image is grayscale or color** first by Using `3 == len(img.shape)` . print( img.shape, img.size, img.dtype)
(342, 548, 3) 562248 uint8

Splitting and Merging Image Channels

Sometimes you will need to work separately on the B,G,R channels of an image.

  • In this case, you need to split the BGR image into single channels.
  • In other cases, you may need to join these individual channels to create a BGR image.
  • Warning: cv.split() is a time costly operation. So use it only if necessary.

    Otherwise go for Numpy indexing.

You can do this simply by:

b, g, r = cv.split(img)
img = cv.merge((b, g, r)) # OR a better faster way by using **Numpy indexing** b, g, r =img[:,:,0], img[:,:,0] img[:,:,0]
img = cv.merge((b, g, r)) # Suppose you want to set all the red pixels to zero
# **Numpy indexing is faster**,
# so you do not need to split the channels first.: img[:,:,2] = 0

Accessing and Modifying pixel values

You can access a pixel value by its row and column coordinates.

  • For BGR image, it returns an array of Blue, Green, Red values.
  • For grayscale image, just corresponding intensity is returned.
# Access a pixel value by its row and column coordinates
px = img[100, 100]
print( px )
[157 166 200] # an array of Blue, Green, Red values for BGR image
# accessing only blue pixel
blue = img[100, 100, 0]
print( blue )
157
#You can modify the pixel values the same way.
img[100, 100] = [255, 255, 255]
print( img[100, 100] )
[255 255 255] # **Better pixel accessing and editing method** : # accessing only RED value
img.item(10, 10, 2)
59
# modifying RED value
img.itemset((10, 10, 2), 100)
img.item(10, 10, 2)
100
  • Warning: Numpy is an optimized library for fast array calculations.

    So simply accessing each and every pixel value and modifying it will be very slow and it is discouraged.
  • Note
    • The above coordinates method is normally used for selecting a region of an array,

      say the first 5 rows and last 3 columns.
    • For individual pixel access, the Numpy array methods, array.item() and array.itemset() are considered better.

      They always return a scalar, however, so if you want to access all the B,G,R values, you will need to call array.item() separately for each value.

ROI of Image

Sometimes, you will have to play with certain regions of images. For eye detection in images:

  • first face detection is done over the entire image.
  • when a face is obtained, we select the face region alone and search for eyes inside it instead of searching the whole image. It improves:
    • accuracy, because eyes are always on faces ,
    • performance, because we search in a small area.

ROI is again obtained using Numpy indexing.

# Here I am selecting the ball and copying it to another region in the image:
ball = img[280:340, 330:390]
img[273:333, 100:160] = ball

Check the results below

Making Borders for Images (Padding)

If you want to create a border around an image, something like a photo frame,

you can use cv.copyMakeBorder(). But it has more applications for convolution operation, zero padding etc. This function takes following arguments:

  • src - input image
  • top, bottom, left, right - border width in number of pixels in corresponding directions
  • borderType - Flag defining what kind of border to be added. It can be following types:
    • cv.BORDER_CONSTANT - Adds a constant colored border. The value should be given as next argument.
    • cv.BORDER_REFLECT - Border will be mirror reflection of the border elements, like this : fedcba|abcdefgh|hgfedcb
    • cv.BORDER_REFLECT_101 or cv.BORDER_DEFAULT - Same as above, but with a slight change, like this : gfedcb|abcdefgh|gfedcba
    • cv.BORDER_REPLICATE - Last element is replicated throughout, like this: aaaaaa|abcdefgh|hhhhhhh
    • cv.BORDER_WRAP - Can't explain, it will look like this : cdefgh|abcdefgh|abcdefg
  • value - Color of border if border type is cv.BORDER_CONSTANT

Below is a sample code demonstrating all these border types for better understanding:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt BLUE = [255, 0, 0] img1 = cv.imread('opencv-logo.png')
assert img1 is not None, "file could not be read, check with os.path.exists()" replicate = cv.copyMakeBorder(img1, 10,10,10,10, cv.BORDER_REPLICATE)
reflect = cv.copyMakeBorder(img1, 10,10,10,10, cv.BORDER_REFLECT)
reflect101 = cv.copyMakeBorder(img1, 10,10,10,10, cv.BORDER_REFLECT_101)
wrap = cv.copyMakeBorder(img1, 10,10,10,10, cv.BORDER_WRAP)
constant= cv.copyMakeBorder(img1, 10,10,10,10, cv.BORDER_CONSTANT,value=BLUE)
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()

See the result below. (Image is displayed with matplotlib. So RED and BLUE channels will be interchanged):

SciTech-BigDataAI-ImageProcessing-Numerical Analysis-Useful Operations-Color Image Channels with OpenCV+NumPy+Pandas的更多相关文章

  1. 为什么要学习Numerical Analysis

    前几日我发了一个帖子,预告自己要研究一下  Numerical Analysis 非常多人问我为啥,我统一回答为AI-----人工智能 我在和教授聊天的时候,忽然到了语言发展上 我说:老S啊(和我关系 ...

  2. <<Numerical Analysis>>笔记

    2ed,  by Timothy Sauer DEFINITION 1.3A solution is correct within p decimal places if the error is l ...

  3. <Numerical Analysis>(by Timothy Sauer) Notes

    2ed,  by Timothy Sauer DEFINITION 1.3A solution is correct within p decimal places if the error is l ...

  4. Numerical Analysis

    PART1  <求解方程> 1,二分法 def bisect(f,a,b,TOL=0.000004): u_a = a u_b = b while(u_b-u_a)/2.0 > TO ...

  5. Residual (numerical analysis)

    In many cases, the smallness of the residual means that the approximation is close to the solution, ...

  6. List of numerical libraries,Top Numerical Libraries For C#

    Top Numerical Libraries For C# AlgLib (http://alglib.net) ALGLIB is a numerical analysis and data pr ...

  7. 【翻译】Kinect v2程序设计(C++) Color篇

    Kinect SDK v2预览版,获取数据的基本流程的说明.以及取得Color图像的示例程序的介绍. 上一节,是关于当前型号Kinect for Windows(后面称作Kinect v1)和次世代型 ...

  8. 常用python机器学习库总结

    开始学习Python,之后渐渐成为我学习工作中的第一辅助脚本语言,虽然开发语言是Java,但平时的很多文本数据处理任务都交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处 ...

  9. (自用)专业排版套装:CTeX + TeXStudio

    \documentclass[UTF8,landscape]{ctexart}%UTF8,ctexart中文支持,landscape横向版面 \usepackage{tikz}%画图 \usepack ...

  10. CG&CAD resource

    Computational Geometry The Geometry Center (UIUC) Computational Geometry Pages (UIUC) Geometry in Ac ...

随机推荐

  1. 异步IO与Tortoise-ORM的数据库

    title: 异步IO与Tortoise-ORM的数据库 date: 2025/04/29 13:21:47 updated: 2025/04/29 13:21:47 author: cmdragon ...

  2. MCP 实践系列:EdgeOne 在线部署HTML页面

    今天,我们将专门讲解一下 EdgeOne 在线部署 HTML 页面时所提供的 MCP 功能.这个功能对于个人用户来说非常实用,尤其适合一些小型应用场景,比如开发一个简单的小游戏,或者搭建一个小型网站, ...

  3. k8s之serviceaccount,登录账号创建

    kubectl  --> 认证 --->授权 -->准入控制 认证:证书 身份识别 授权:rbac  权限检查 准入控制:  补充授权机制 多个插件实现 只在创建 删除 修改 或做代 ...

  4. 应用间通信(一):详解Linux进程IPC

    进程之间是独立的.隔离的,使得应用程序之间绝对不可以互相"侵犯"各自的领地. 但,应用程序之间有时是需要互相通信,相互写作,才能完成相关的功能,这就不得不由操作系统介入,实现一种通 ...

  5. Sublimetext3 配置C语言环境

    1.MinGW下载 2.设置MinGW环境变量 - Path               C:\MinGW\bin 3.在sublime工具栏中,选择"工具"->" ...

  6. ctf知识积累

    (1)url解码: python解码函数: from urllib.parse import unquote(quote:编码) url_code="" url_code1=unq ...

  7. java LocalDateTime 加减当前时间

      LocalDateTime 可以对当前时间进行加减,在LocalDateTime类中,以plus打头的方法是增加某项时间,如plusDays的请求参数表示将要增加的天数,但是可以为负值:以minu ...

  8. 把PDF转换成指定后缀名的图片

      生活中难免遇到各种文件类型转换的问题,尤其是在办理一些证件的时候.例如,申请居住证积分的时候,把PDF版本的毕业证扫描件转换成jpg或者png等.下面提供一个工具,用于把PDF转换成指定后缀名的图 ...

  9. K8S对Pod调度失败,Schdule控制器报错1 scheduling_queue.go:346] Unable to find backoff value for pod default/engine-video-process-worker-face-face-24902-t4-6b5bcf6d9c-swdwp in backoffQ

    问题描述: 1.生产环境,基于K8s部署的应用,某个应用按要求需要运行9个副本,项目成功运行50余天后,应用的pod突然由9个变为6个,其他3个变为Pengding状态: 2.9个Pod需要消耗服务器 ...

  10. python 多进程通讯三种方法性能对比(queue, pipe, zeromq)

    当然,这三种办法都会在两个进程之间把数据复制一遍,效率肯定没有 shared memory 高,但是考虑到这三种方式都不用考虑锁之类东西,用起来是比较方便的.这三种方式的实现的功能都是差不多的,但是在 ...