Welcome to Transbot SE repository
4. Open Source CV image beautification
4. Image beautification
4.1. OpenCV repair pictures
- Image inpainting is a type of algorithm in computer vision whose goal is to fill in areas within an image or video. The area is identified using a binary mask, and filling is usually done based on the area boundary information that needs to be filled. The most common application of image restoration is to restore old scanned photos. It is also used to remove small unwanted objects from images.
- In OpenCV, dst = cv2.inpaint(src, inpaintMask, inpaintRadius, flags) is provided to repair the image.
Parameter meaning:
src: source image, which is the image that needs to be repaired
inpaintMask: Binary mask indicating which pixels to inpaint.
dst: result image
inpaintRadius: represents the radius of repair
flags: Repair algorithm, mainly INPAINT_NS (Navier-Stokes based method) or INPAINT_TELEA (Fast marching based method)
Navier-Stokes based repairs should be slower and tend to produce blurrier results than fast marching methods. In practice, we did not find this to be the case. INPAINT_NS produced better results in our tests and was slightly faster than INPAINT_TELEA.
- Code and actual effect display
(1) First, we first add damage to the intact picture, which can be understood as modifying the pixel value of a specific part of it.
Run program
jetson motherboard/Raspberry Pi 4B
cd ~/transbot_ws/src/transbot_visual/opencvpython4_1.pyRaspberry Pi 5
Before running, please confirm that the large program has been permanently closed
Enter docker
Note: If you have a terminal that automatically starts docker, you can directly enter the docker terminal to run the command, and there is no need to manually start docker
Start docker manually
xxxxxxxxxx./run_docker.sh

Run program
xxxxxxxxxxcd ~/transbot_ws/src/transbot_visual/opencvpython 4_1_1.py
xxxxxxxxxximport cv2import numpy as npif __name__ == '__main__':img = cv2.imread('yahboom.jpg')for i in range(50,100):img[i,50] = (0,0,0)img[i,50+1] = (0,0,0)img[i,50-1] = (0,0,0)for i in range(100,150):img[150,i] = (0,0,0)img[150,i+1] = (0,0,0)img[150-1,i] = (0,0,0)cv2.imwrite("damaged.jpg",img)dam_img = cv2.imread('damaged.jpg')while True :cv2.imshow("dam_img",dam_img)action = cv2.waitKey(10) & 0xFFif action == ord('q') or action == 113:breakimg.release()cv2.destroyAllWindows()After running, a picture will be generated, which is regarded as a damaged picture of the original picture.

(2) To repair the photo just created, first read it, then create the mask, and finally use the function to repair it
Run program
jetson motherboard/Raspberry Pi 4B
xxxxxxxxxxcd ~/transbot_ws/src/transbot_visual/opencvpython 4_1_2.pyRaspberry Pi 5
Before running, please confirm that the large program has been permanently closed
Enter docker
Note: If you have a terminal that automatically starts docker, you can directly enter the docker terminal to run the command, and there is no need to manually start docker
Start docker manually
xxxxxxxxxx./run_docker.sh

Run program
xxxxxxxxxxcd ~/transbot_ws/src/transbot_visual/opencvpython 4_1_2.py
xxxxxxxxxximport cv2import numpy as npif __name__ == '__main__':dam_img = cv2.imread('damaged.jpg')imgInfo = dam_img.shapeheight = imgInfo[0]width = imgInfo[1]paint = np.zeros((height,width,1),np.uint8)for i in range(50,100):paint[i,50] = 255paint[i,50+1] = 255paint[i,50-1] = 255for i in range(100,150):paint[150,i] = 255paint[150+1,i] = 255paint[150-1,i] = 255dst_img = cv2.inpaint(dam_img,paint,3,cv2.INPAINT_TELEA)while True :cv2.imshow("dam_img",dam_img)cv2.imshow("paint",paint)cv2.imshow("dst",dst_img)action = cv2.waitKey(10) & 0xFFif action == ord('q') or action == 113:breakimg.release()cv2.destroyAllWindows()
As shown in the figure, the left is before repair, the middle is the mask image, and the right is the original image after repair.
4.2. OpenCV image brightness enhancement
- Implementation process: synchronously amplify the three-channel value of each pixel while keeping the channel value between 0-255. In fact, it is to traverse each pixel, add and subtract values to them, and then judge the three channels. Whether rgb is in the range of 0-255, if it is greater or less than 255 or 0.
- Code and actual effect display
Run program
jetson motherboard/Raspberry Pi 4B
xxxxxxxxxxcd ~/transbot_ws/src/transbot_visual/opencvpython4_2.pyRaspberry Pi 5
Before running, please confirm that the large program has been permanently closed
Enter docker
Note: If you have a terminal that automatically starts docker, you can directly enter the docker terminal to run the command, and there is no need to manually start docker
Start docker manually
xxxxxxxxxx./run_docker.sh

Run program
xxxxxxxxxxcd ~/transbot_ws/src/transbot_visual/opencvpython4_2.py
xxxxxxxxxximport cv2import numpy as npif __name__ == '__main__':img = cv2.imread('yahboom.jpg')imgInfo = img.shapeheight = imgInfo[0]width = imgInfo[1]dst = np.zeros((height,width,3),np.uint8)for i in range(0,height):for j in range(0,width):(b,g,r) = img[i,j]bb = int(b) + 100gg = int(g) + 100rr = int(r) + 100ifbb>255:b = 255if gg > 255:gg = 255ifrr > 255:rr = 255dst[i,j] = (bb,gg,rr)while True :cv2.imshow("dst",dst)action = cv2.waitKey(10) & 0xFFif action == ord('q') or action == 113:breakimg.release()cv2.destroyAllWindows()
The picture on the left is the original picture, and the picture on the back is the photo after increasing the brightness.
4.3. OpenCV image skin whitening
- OpenCV implements the function of skin resurfacing and whitening images. The principle of implementation is basically the same as that of "1.20 OpenCV Image Brightness Enhancement", except that here we do not need to process the r value. We only need to follow this formula, p = p(x)*1.4+ y, where p(x) represents the b channel or g channel, and y represents the value that needs to be increased or decreased. Similarly, after adding the value, we need to make a judgment on the value.
- Code and actual effect display
Run program
jetson motherboard/Raspberry Pi 4B
xxxxxxxxxxcd ~/transbot_ws/src/transbot_visual/opencvpython 4_3.pyRaspberry Pi 5
Before running, please confirm that the large program has been permanently closed
Enter docker
Note: If you have a terminal that automatically starts docker, you can directly enter the docker terminal to run the command, and there is no need to manually start docker
Start docker manually
xxxxxxxxxx./run_docker.sh

Run program
xxxxxxxxxxcd ~/transbot_ws/src/transbot_visual/opencvpython 4_3.py
xxxxxxxxxximport cv2import numpy as npif __name__ == '__main__': img = cv2.imread('yahboom.jpg') imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] dst = np.zeros((height,width,3),np.uint8) for i in range(0,height): for j in range(0,width): (b,g,r) = img[i,j] bb = int(b*1.4) + 5 gg = int(g*1.4) + 5 if bb > 255: bb = 255 if gg > 255: gg = 255 dst[i,j] = (bb,gg,r) while True : cv2.imshow("origin",img) cv2.imshow("dst",dst) action = cv2.waitKey(10) & 0xFF if action == ord('q') or action == 113: break img.release() cv2.destroyAllWindows()