检测对比图像的纹理背景
Detect textured background for contrasted images
我有两种类型的图像,它们都是对比的。
类型 1:(白色和干净的背景)
类型 2:(背景中有一些灰色纹理)
我可以应用高斯模糊和阈值来处理类型 2 图像,将其调整为像类型 1 一样的白色背景,如下代码所示:
type2_img = cv2.imread(type2.png)
# convert to grayscale
gray = cv2.cvtColor(type2_img , cv2.COLOR_BGR2GRAY)
# threshold the image using Otsu's thresholding
thresh = cv2.threshold(gray.copy(), 0, 255, cv2.THRESH_OTSU)[1]
# convert back to RGB
type2_img = cv2.cvtColor(thresh,cv2.COLOR_GRAY2RGB)
而且,我可以得到以下结果:
但是,我不想对类型 1 图像应用相同的方法,因为它已经满足条件。
那么,OpenCV 中是否有任何图像处理方法可以区分类型 2 图像和类型 1 图像?
要知道图像是否模糊,我会使用拉普拉斯算子的方差。
import cv2
im1 = cv2.imread("s1.png")
im2 = cv2.imread("s2.png")
print(f"Im1: {cv2.Laplacian(im1, cv2.CV_64F).var()}")
print(f"Im2: {cv2.Laplacian(im2, cv2.CV_64F).var()}")
输出:
Im1: 10493.1934011934
Im2: 17803.672073381236
我会在每个 class 浏览一些训练集或示例的中间设置一个阈值。
希望有用!
您提供的type 1
图像是灰度图像,而不是完全黑白图像。然而最后的阈值输出图像是黑白的。
根据你的问题,我的理解是这两个都应归类为 type 1
,而 type 2
图像示例应归类为类型 2。
如果类型 1 始终是黑白的,您可以计算图像中 0 和 1 的数量,并检查它们的总和是否等于图像的总像素数。
这里的一个选项是在不修改图像的情况下将两种类型的图像分类是使用图像直方图的黑白像素百分比。
代码
import cv2
import numpy as np
from matplotlib import pyplot as plt
from skimage import exposure
#img_path = r'hist_imgs/1.png'
#img_path = r'hist_imgs/2.png'
img_path = r'hist_imgs/3.png'
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
cv2.imshow('Image', img)
img_pixel_count = img.shape[0] * img.shape[1]
print(img.shape)
print(img_pixel_count)
h = np.array(exposure.histogram(img, nbins=256))
bw_count = h[0][0] + h[0][255]
other_count = img_pixel_count - bw_count
print('BW PIXEL COUNT: ', bw_count)
print('OTHER PIXEL COUNT: ', other_count)
bw_percentage = (bw_count * 100.0) / img_pixel_count
other_percentage = (other_count * 100.0) / img_pixel_count
print('BW PIXEL PERCENTAGE: ', bw_percentage)
print('OTHER PIXEL PERCENTAGE: ', other_percentage)
differentiate_threshold = 3.0
if other_percentage > differentiate_threshold:
print('TYPE 2: GRAYSCALE')
else:
print('TYPE 1: BLACK AND WHITE')
plt.hist(img.ravel(), 256, [0, 256])
plt.title('Histogram')
plt.show()
输入图像
图片1:
图2:
图3:
代码输出
图片1:
(154, 74)
11396
BW PIXEL COUNT: 11079
OTHER PIXEL COUNT: 317
BW PIXEL PERCENTAGE: 97.21832221832221
OTHER PIXEL PERCENTAGE: 2.781677781677782
TYPE 1: BLACK AND WHITE
图2:
(38, 79)
3002
BW PIXEL COUNT: 1543
OTHER PIXEL COUNT: 1459
BW PIXEL PERCENTAGE: 51.39906728847435
OTHER PIXEL PERCENTAGE: 48.60093271152565
TYPE 2: GRAYSCALE
图3:
(38, 79)
3002
BW PIXEL COUNT: 3002
OTHER PIXEL COUNT: 0
BW PIXEL PERCENTAGE: 100.0
OTHER PIXEL PERCENTAGE: 0.0
TYPE 1: BLACK AND WHITE
我有两种类型的图像,它们都是对比的。
类型 1:(白色和干净的背景)
类型 2:(背景中有一些灰色纹理)
我可以应用高斯模糊和阈值来处理类型 2 图像,将其调整为像类型 1 一样的白色背景,如下代码所示:
type2_img = cv2.imread(type2.png)
# convert to grayscale
gray = cv2.cvtColor(type2_img , cv2.COLOR_BGR2GRAY)
# threshold the image using Otsu's thresholding
thresh = cv2.threshold(gray.copy(), 0, 255, cv2.THRESH_OTSU)[1]
# convert back to RGB
type2_img = cv2.cvtColor(thresh,cv2.COLOR_GRAY2RGB)
而且,我可以得到以下结果
但是,我不想对类型 1 图像应用相同的方法,因为它已经满足条件。
那么,OpenCV 中是否有任何图像处理方法可以区分类型 2 图像和类型 1 图像?
要知道图像是否模糊,我会使用拉普拉斯算子的方差。
import cv2
im1 = cv2.imread("s1.png")
im2 = cv2.imread("s2.png")
print(f"Im1: {cv2.Laplacian(im1, cv2.CV_64F).var()}")
print(f"Im2: {cv2.Laplacian(im2, cv2.CV_64F).var()}")
输出:
Im1: 10493.1934011934
Im2: 17803.672073381236
我会在每个 class 浏览一些训练集或示例的中间设置一个阈值。
希望有用!
您提供的type 1
图像是灰度图像,而不是完全黑白图像。然而最后的阈值输出图像是黑白的。
根据你的问题,我的理解是这两个都应归类为 type 1
,而 type 2
图像示例应归类为类型 2。
如果类型 1 始终是黑白的,您可以计算图像中 0 和 1 的数量,并检查它们的总和是否等于图像的总像素数。
这里的一个选项是在不修改图像的情况下将两种类型的图像分类是使用图像直方图的黑白像素百分比。
代码
import cv2
import numpy as np
from matplotlib import pyplot as plt
from skimage import exposure
#img_path = r'hist_imgs/1.png'
#img_path = r'hist_imgs/2.png'
img_path = r'hist_imgs/3.png'
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
cv2.imshow('Image', img)
img_pixel_count = img.shape[0] * img.shape[1]
print(img.shape)
print(img_pixel_count)
h = np.array(exposure.histogram(img, nbins=256))
bw_count = h[0][0] + h[0][255]
other_count = img_pixel_count - bw_count
print('BW PIXEL COUNT: ', bw_count)
print('OTHER PIXEL COUNT: ', other_count)
bw_percentage = (bw_count * 100.0) / img_pixel_count
other_percentage = (other_count * 100.0) / img_pixel_count
print('BW PIXEL PERCENTAGE: ', bw_percentage)
print('OTHER PIXEL PERCENTAGE: ', other_percentage)
differentiate_threshold = 3.0
if other_percentage > differentiate_threshold:
print('TYPE 2: GRAYSCALE')
else:
print('TYPE 1: BLACK AND WHITE')
plt.hist(img.ravel(), 256, [0, 256])
plt.title('Histogram')
plt.show()
输入图像
图片1:
图2:
图3:
代码输出
图片1:
(154, 74)
11396
BW PIXEL COUNT: 11079
OTHER PIXEL COUNT: 317
BW PIXEL PERCENTAGE: 97.21832221832221
OTHER PIXEL PERCENTAGE: 2.781677781677782
TYPE 1: BLACK AND WHITE
图2:
(38, 79)
3002
BW PIXEL COUNT: 1543
OTHER PIXEL COUNT: 1459
BW PIXEL PERCENTAGE: 51.39906728847435
OTHER PIXEL PERCENTAGE: 48.60093271152565
TYPE 2: GRAYSCALE
图3:
(38, 79)
3002
BW PIXEL COUNT: 3002
OTHER PIXEL COUNT: 0
BW PIXEL PERCENTAGE: 100.0
OTHER PIXEL PERCENTAGE: 0.0
TYPE 1: BLACK AND WHITE