Python3使用OpenCV实现图像最大颜色块的判别和图像边缘分割与提取

        Python3使用OpenCV实现图像最大颜色块的判别和图像边缘分割与提取。使用的方法简单朴素,调用OpenCV的同时,自己写了个图像最大颜色区块的相似判别,最后输出该图像。

代码如下:

import cv2
import numpy as np

color_mofang = []

image_1 = cv2.imread("G:\\videos\\mofang.jpeg")

#image_2 = image_1

a,b,c = image_1.shape

print(a,b,c)
s = ""
for i in range(a):
    for j in range(b):
        s = ""
        if(image_1[i,j,0]<=225 and image_1[i,j,1]<=225 and image_1[i,j,2]<=225):
         if(image_1[i,j,0]>=45 and image_1[i,j,1]>=45 and image_1[i,j,2]>=45):
        #    color_mofang.append(str(image_1[i,j,0])+str(image_1[i,j,1])+str(image_1[i,j,2]))
                if(abs(image_1[i,j,0]-image_1[i,j,1])>=45 and abs(image_1[i,j,2]-image_1[i,j,1])>=45 and abs(image_1[i,j,2]-image_1[i,j,0])>=45):
                    for k in range(3):
                     image_1[i,j,k] = int(image_1[i,j,k]/2)*2
                     if(image_1[i,j,k]<10):
                        s = s + "00" + str(image_1[i,j,k])
                     elif (image_1[i,j,k]<100): 
                        s = s + "0" + str(image_1[i,j,k])
                     else:
                        s = s + str(image_1[i,j,k])    
                    color_mofang.append(s)

color_mofang_2 = []

for x in color_mofang:
    if(x not in color_mofang_2):
        color_mofang_2.append(x)

d = []
for x in color_mofang_2:
    d.append(color_mofang.count(x))

max_color = max(d)

i = d.index(max_color)

#print(d)

print(color_mofang_2[i])

aa = int(color_mofang_2[i][0:2])
bb = int(color_mofang_2[i][3:5])
cc = int(color_mofang_2[i][6:8])

for i in range(a):
    for j in range(b):

      if(not(image_1[i,j,0]<=225 and image_1[i,j,1]<=225 and image_1[i,j,2]<=225)):
           for k in range(3):
            image_1[i,j,k]=255 
            

      if(not(image_1[i,j,0]>=25 and image_1[i,j,1]>=25 and image_1[i,j,2]>=25)):
           for k in range(3):
            image_1[i,j,k]=255         

     #flag2 = image_1[i,j,0]>=105 or image_1[i,j,1]>=105 or image_1[i,j,2]>=105 
     #flag2 = True  
     #if(not((abs(image_1[i,j,0]-image_1[i,j,1])>=45) and abs(image_1[i,j,2]-image_1[i,j,1])>=45 and abs(image_1[i,j,2]-image_1[i,j,0])>=45) and flag2): 
      #flag = image_1[i,j,0]>=105 and image_1[i,j,1]>=105 and image_1[i,j,2]>=105
      flag = True  
      if((abs(image_1[i,j,0]-aa)<6 and abs(image_1[i,j,1]-bb)<6 and abs(image_1[i,j,2]-cc)<6) or not flag):
    #    if(not(image_1[i,j,0]==cc and image_1[i,j,1]==bb and image_1[i,j,2]==aa) or (not flag)):
    #   if(not(image_1[i,j,0]==aa and image_1[i,j,1]==bb and image_1[i,j,2]==cc)):        
          for k in range(3):
            image_1[i,j,k]=255            

cv2.imshow("final_image",image_1)
cv2.waitKey(0)
cv2.imwrite("G:\\videos\\mofang2.jpeg",image_1)

filename="G:\\videos\\mofang2.jpeg"
img = cv2.imread(filename,0)
print(np.shape(img))
kernel = np.ones((3,3),np.uint8)
dilate = cv2.dilate(img,kernel,iterations = 1)
# 显示图片
# ## 效果展示
# cv2.imshow('origin', img)
 
 
cv2.imwrite('G:\\videos\\lishuwang_dilate.jpg',dilate)
# erosion = cv2.erode(img,kernel,iterations = 1)
# cv2.imwrite('lishuwang_erosion.jpg',erosion)
 
canny1=cv2.Canny(dilate,100,200)
cv2.imwrite('G:\\videos\\lishuwang_canny.jpg',canny1)
 
# kernel2 = np.ones((2,1),np.uint8)
# erosion = cv2.erode(canny,kernel2,iterations = 1)
# cv2.imwrite('lishuwang_erosion.jpg',erosion)
 
_, labels, stats, centroids = cv2.connectedComponentsWithStats(canny1)
print(centroids)
print("stats",stats)
i=0
for istat in stats:
    if istat[4]<2:
        #print(i)
        print(istat[0:2])
        if istat[3]>istat[4]:
            r=istat[3]
        else:r=istat[4]
        cv2.rectangle(canny1,tuple(istat[0:2]),tuple(istat[0:2]+istat[2:4]) , 0,thickness=-1)  # 26
    i=i+1
 
 
cv2.imwrite('G:\\videos\\lishuwang_canny1.jpg',canny1)

cv2.imshow("final_image",canny1)
cv2.waitKey(0)
cv2.imwrite("G:\\videos\\mofang3.jpeg",canny1)

效果如下:

 

 

 颜色区块提取和轮廓分割效果如下:

 

 

 

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python OpenCV 提供了许多图像增强、边缘检测和颜色分割的函数和算法,下面我介绍几个常用的方法: 1. 图像增强 - 直方图均衡化:通过增加图像的对比度,使得图像更加清晰,可以使用函数 `cv2.equalizeHist()` 实现。 ```python import cv2 img = cv2.imread('image.jpg', 0) equ = cv2.equalizeHist(img) cv2.imshow('Original Image', img) cv2.imshow('Equalized Image', equ) cv2.waitKey(0) cv2.destroyAllWindows() ``` - 锐化:通过增加图像边缘和细节,使得图像更加清晰,可以使用函数 `cv2.filter2D()` 实现。 ```python import cv2 import numpy as np img = cv2.imread('image.jpg', 0) kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) sharp = cv2.filter2D(img, -1, kernel) cv2.imshow('Original Image', img) cv2.imshow('Sharpened Image', sharp) cv2.waitKey(0) cv2.destroyAllWindows() ``` 2. 边缘检测 - Canny 边缘检测:通过检测图像中的强度梯度来检测边缘,可以使用函数 `cv2.Canny()` 实现。 ```python import cv2 img = cv2.imread('image.jpg', 0) edges = cv2.Canny(img, 100, 200) cv2.imshow('Original Image', img) cv2.imshow('Canny Edges', edges) cv2.waitKey(0) cv2.destroyAllWindows() ``` 3. 颜色分割 - 色彩空间转换:将图像从 BGR 色彩空间转换为 HSV 色彩空间,可以使用函数 `cv2.cvtColor()` 实现。 ```python import cv2 img = cv2.imread('image.jpg') hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) cv2.imshow('Original Image', img) cv2.imshow('HSV Image', hsv) cv2.waitKey(0) cv2.destroyAllWindows() ``` - 阈值分割:将图像中的像素根据一定的阈值进行分类,可以使用函数 `cv2.threshold()` 实现。 ```python import cv2 img = cv2.imread('image.jpg', 0) ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) cv2.imshow('Original Image', img) cv2.imshow('Thresholded Image', thresh) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值